Release 4.0.0-preview1-00183
authorDotnetBuild <dotnetbuild.tizen@gmail.com>
Mon, 11 Sep 2017 15:00:27 +0000 (00:00 +0900)
committerDotnetBuild <dotnetbuild.tizen@gmail.com>
Mon, 11 Sep 2017 15:00:27 +0000 (00:00 +0900)
74 files changed:
packaging/csapi-tizenfx.spec
src/Tizen.Applications.PackageManager/Tizen.Applications/PackageCertificate.cs
src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Capabilities.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Events.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Settings.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.cs
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorder.Capabilities.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorder.Events.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorder.cs
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderAudioOptions.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderBufferConsumedEventArgs.cs [moved from src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecordingBufferConsumedEventArgs.cs with 67% similarity]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderEnums.cs
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderError.cs [moved from src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderErrorFactory.cs with 58% similarity]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderErrorOccurredEventArgs.cs [moved from src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecordingLimitReachedEventArgs.cs with 60% similarity]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderNotifiedEventArgs.cs [deleted file]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderOptions.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderStateChangedEventArgs.cs [moved from src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecordingErrorOccurredEventArgs.cs with 50% similarity]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderVideoOptions.cs [new file with mode: 0644]
src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderVideoResolution.cs [deleted file]
src/Tizen.NUI/src/internal/AppSignalType.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/Application.cs
src/Tizen.NUI/src/internal/FriendAssembly.cs
src/Tizen.NUI/src/internal/ManualPINVOKE.cs
src/Tizen.NUI/src/internal/NDalicPINVOKE.cs
src/Tizen.NUI/src/internal/NUICoreBackend.cs
src/Tizen.NUI/src/internal/NUIWidgetCoreBackend.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/SWIGTYPE_p_bundle.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/SWIGTYPE_p_f_p_Dali__BaseObject_p_Dali__ConnectionTrackerInterface.cs [moved from src/Tizen.NUI/src/internal/SWIGTYPE_p_f_p_Dali__BaseObject_p_Dali__ConnectionTrackerInterface_r_q_const__std__string_p_Dali__FunctorDelegate__bool.cs with 100% similarity]
src/Tizen.NUI/src/internal/TouchPoint.cs
src/Tizen.NUI/src/internal/ViewWrapperImpl.cs
src/Tizen.NUI/src/internal/WidgetApplication.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/WidgetInstanceCreateSignalType.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/WidgetInstancePauseOrResumeSignalType.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/WidgetInstanceResizeSignalType.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/WidgetInstanceTerminateSignalType.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/WidgetInstanceUpdateSignalType.cs [new file with mode: 0755]
src/Tizen.NUI/src/internal/dotnetcore/AddedException.cs
src/Tizen.NUI/src/public/Animation.cs
src/Tizen.NUI/src/public/BaseComponents/Scrollable.cs
src/Tizen.NUI/src/public/BaseComponents/TextEditor.cs
src/Tizen.NUI/src/public/BaseComponents/TextField.cs
src/Tizen.NUI/src/public/BaseComponents/TextLabel.cs
src/Tizen.NUI/src/public/BaseComponents/VideoView.cs
src/Tizen.NUI/src/public/BaseComponents/View.cs
src/Tizen.NUI/src/public/BaseComponents/VisualView.cs
src/Tizen.NUI/src/public/BaseHandle.cs
src/Tizen.NUI/src/public/Container.cs [new file with mode: 0755]
src/Tizen.NUI/src/public/FocusManager.cs
src/Tizen.NUI/src/public/ImfManager.cs
src/Tizen.NUI/src/public/Layer.cs
src/Tizen.NUI/src/public/NUIApplication.cs
src/Tizen.NUI/src/public/NUIWidgetApplication.cs [new file with mode: 0755]
src/Tizen.NUI/src/public/StyleManager.cs
src/Tizen.NUI/src/public/TTSPlayer.cs
src/Tizen.NUI/src/public/Timer.cs
src/Tizen.NUI/src/public/UIComponents/Button.cs
src/Tizen.NUI/src/public/UIComponents/Popup.cs
src/Tizen.NUI/src/public/UIComponents/ProgressBar.cs
src/Tizen.NUI/src/public/UIComponents/ScrollBar.cs
src/Tizen.NUI/src/public/UIComponents/ScrollView.cs
src/Tizen.NUI/src/public/UIComponents/Slider.cs
src/Tizen.NUI/src/public/VisualMaps.cs
src/Tizen.NUI/src/public/Widget.cs [new file with mode: 0755]
src/Tizen.NUI/src/public/WidgetData.cs [new file with mode: 0755]
src/Tizen.NUI/src/public/Window.cs
src/Tizen.Network.Nsd/Tizen.Network.Nsd/DnssdBrowser.cs
src/Tizen.Network.Nsd/Tizen.Network.Nsd/DnssdService.cs
src/Tizen.Network.Nsd/Tizen.Network.Nsd/INsdBrowser.cs
src/Tizen.Network.Nsd/Tizen.Network.Nsd/INsdService.cs
src/Tizen.Network.Nsd/Tizen.Network.Nsd/NamespaceDoc.cs
src/Tizen.Network.Nsd/Tizen.Network.Nsd/SsdpBrowser.cs
src/Tizen.Network.Nsd/Tizen.Network.Nsd/SsdpService.cs
src/Tizen.Pims.Contacts/Tizen.Pims.Contacts.sln [changed mode: 0755->0644]
src/Tizen.Pims.Contacts/Tizen.Pims.Contacts/ContactsDatabase.cs

index 7c9fb73..8cac95e 100644 (file)
@@ -10,7 +10,7 @@
 
 Name:       csapi-tizenfx
 Summary:    Assemblies of Tizen .NET
-Version:    4.0.0.175
+Version:    4.0.0.183
 Release:    1
 Group:      Development/Libraries
 License:    Apache-2.0
index 2e9a979..264db10 100755 (executable)
@@ -81,8 +81,8 @@ namespace Tizen.Applications
             certificates.Add(CertificateType.Distributor, new PackageCertificate(distRootCertificate, distIntermediateCertificate, distSignerCertificate));
 
             string dist2RootCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2RootCertificate);
-            string dist2IntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2RootCertificate);
-            string dist2SignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2RootCertificate);
+            string dist2IntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2IntermediateCertificate);
+            string dist2SignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2SignerCertificate);
             certificates.Add(CertificateType.Distributor2, new PackageCertificate(dist2RootCertificate, dist2IntermediateCertificate, dist2SignerCertificate));
 
             return certificates;
diff --git a/src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Capabilities.cs b/src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Capabilities.cs
new file mode 100644 (file)
index 0000000..133674e
--- /dev/null
@@ -0,0 +1,37 @@
+using System;
+using System.Runtime.InteropServices;
+using Tizen.Multimedia;
+
+internal static partial class Interop
+{
+    internal static partial class StreamRecorder
+    {
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate bool VideoResolutionCallback(int width, int height, IntPtr userData);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate bool FileFormatCallback(StreamRecorderFileFormat format, IntPtr userData);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate bool AudioEncoderCallback(StreamRecorderAudioCodec codec, IntPtr userData);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate bool VideoEncoderCallback(StreamRecorderVideoCodec codec, IntPtr userData);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_file_format")]
+        internal static extern StreamRecorderErrorCode FileFormats(StreamRecorderHandle handle,
+            FileFormatCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_audio_encoder")]
+        internal static extern StreamRecorderErrorCode AudioEncoders(StreamRecorderHandle handle,
+            AudioEncoderCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_video_encoder")]
+        internal static extern StreamRecorderErrorCode VideoEncoders(StreamRecorderHandle handle,
+            VideoEncoderCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_video_resolution")]
+        internal static extern StreamRecorderErrorCode VideoResolution(StreamRecorderHandle handle,
+            VideoResolutionCallback callback, IntPtr userData = default(IntPtr));
+    }
+}
diff --git a/src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Events.cs b/src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Events.cs
new file mode 100644 (file)
index 0000000..e7febae
--- /dev/null
@@ -0,0 +1,61 @@
+using System;
+using System.Runtime.InteropServices;
+using Tizen.Multimedia;
+
+internal static partial class Interop
+{
+    internal static partial class StreamRecorder
+    {
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void RecordingLimitReachedCallback(RecordingLimitType type, IntPtr userData);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void RecordingStatusCallback(ulong elapsedTime, ulong fileSize, IntPtr userData);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void NotifiedCallback(int previous, int current,
+            StreamRecorderNotify notify, IntPtr userData);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void RecorderErrorCallback(StreamRecorderErrorCode error,
+            RecorderState current, IntPtr userData);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void BufferConsumedCallback(IntPtr buffer, IntPtr userData);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_notify_cb")]
+        internal static extern StreamRecorderErrorCode SetNotifiedCallback(StreamRecorderHandle handle,
+            NotifiedCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_notify_cb")]
+        internal static extern int UnsetNotifiedCallback(StreamRecorderHandle handle);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_recording_status_cb")]
+        internal static extern StreamRecorderErrorCode SetStatusChangedCallback(StreamRecorderHandle handle,
+            RecordingStatusCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_recording_status_cb")]
+        internal static extern int UnsetStatusChangedCallback(StreamRecorderHandle handle);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_recording_limit_reached_cb")]
+        internal static extern StreamRecorderErrorCode SetLimitReachedCallback(StreamRecorderHandle handle,
+            RecordingLimitReachedCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_recording_limit_reached_cb")]
+        internal static extern int UnsetLimitReachedCallback(StreamRecorderHandle handle);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_error_cb")]
+        internal static extern StreamRecorderErrorCode SetErrorCallback(StreamRecorderHandle handle,
+            RecorderErrorCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_error_cb")]
+        internal static extern int UnsetErrorCallback(StreamRecorderHandle handle);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_buffer_consume_completed_cb")]
+        internal static extern StreamRecorderErrorCode SetBufferConsumedCallback(StreamRecorderHandle handle,
+            BufferConsumedCallback callback, IntPtr userData = default(IntPtr));
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_buffer_consume_completed_cb")]
+        internal static extern int UnsetBufferConsumedCallback(StreamRecorderHandle handle);
+    }
+}
diff --git a/src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Settings.cs b/src/Tizen.Multimedia.StreamRecorder/Interop/Interop.StreamRecorder.Settings.cs
new file mode 100644 (file)
index 0000000..a8fabbb
--- /dev/null
@@ -0,0 +1,88 @@
+using System;
+using System.Runtime.InteropServices;
+using Tizen.Multimedia;
+
+internal static partial class Interop
+{
+    internal static partial class StreamRecorder
+    {
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_filename")]
+        internal static extern StreamRecorderErrorCode SetFileName(StreamRecorderHandle handle, string path);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_filename")]
+        internal static extern int GetFileName(StreamRecorderHandle handle, out IntPtr path);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_file_format")]
+        internal static extern StreamRecorderErrorCode SetFileFormat(StreamRecorderHandle handle,
+            StreamRecorderFileFormat format);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_file_format")]
+        internal static extern int GetFileFormat(StreamRecorderHandle handle, out int format);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_encoder")]
+        internal static extern StreamRecorderErrorCode SetAudioEncoder(StreamRecorderHandle handle,
+            StreamRecorderAudioCodec codec);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_encoder")]
+        internal static extern int GetAudioEncoder(StreamRecorderHandle handle, out int codec);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_encoder")]
+        internal static extern StreamRecorderErrorCode SetVideoEncoder(StreamRecorderHandle handle,
+            StreamRecorderVideoCodec codec);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_encoder")]
+        internal static extern int GetVideoEncoder(StreamRecorderHandle handle, out int codec);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_resolution")]
+        internal static extern StreamRecorderErrorCode SetVideoResolution(StreamRecorderHandle handle,
+            int width, int height);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_resolution")]
+        internal static extern StreamRecorderErrorCode GetVideoResolution(StreamRecorderHandle handle,
+            out int width, out int height);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_framerate")]
+        internal static extern StreamRecorderErrorCode SetVideoFrameRate(StreamRecorderHandle handle, int framerate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_framerate")]
+        internal static extern int GetVideoFramerate(StreamRecorderHandle handle, out int framerate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_source_format")]
+        internal static extern StreamRecorderErrorCode SetVideoSourceFormat(StreamRecorderHandle handle,
+            StreamRecorderVideoFormat format);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_source_format")]
+        internal static extern int GetVideoSourceFormat(StreamRecorderHandle handle, out int format);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_recording_limit")]
+        internal static extern StreamRecorderErrorCode SetRecordingLimit(StreamRecorderHandle handle,
+            RecordingLimitType type, int limit);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_recording_limit")]
+        internal static extern int GetRecordingLimit(StreamRecorderHandle handle, int type, out int format);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_samplerate")]
+        internal static extern StreamRecorderErrorCode SetAudioSampleRate(StreamRecorderHandle handle, int samplerate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_samplerate")]
+        internal static extern int GetAudioSampleRate(StreamRecorderHandle handle, out int samplerate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_encoder_bitrate")]
+        internal static extern StreamRecorderErrorCode SetAudioEncoderBitrate(StreamRecorderHandle handle, int bitrate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_encoder_bitrate")]
+        internal static extern int GetAudioEncoderBitrate(StreamRecorderHandle handle, out int bitrate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_encoder_bitrate")]
+        internal static extern StreamRecorderErrorCode SetVideoEncoderBitRate(StreamRecorderHandle handle, int bitrate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_encoder_bitrate")]
+        internal static extern int GetVideoEncoderBitrate(StreamRecorderHandle handle, out int bitrate);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_channel")]
+        internal static extern StreamRecorderErrorCode SetAudioChannel(StreamRecorderHandle handle, int channel);
+
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_channel")]
+        internal static extern int GetAudioChannel(StreamRecorderHandle handle, out int channel);
+    }
+}
index dd79eab..e7f061b 100644 (file)
@@ -6,181 +6,72 @@ internal static partial class Interop
 {
     internal static partial class StreamRecorder
     {
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void RecordingLimitReachedCallback(StreamRecordingLimitType type, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void RecordingStatusCallback(ulong elapsedTime, ulong fileSize, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void NotifiedCallback(StreamRecorderState previous, StreamRecorderState current, StreamRecorderNotify notfication, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void RecorderErrorCallback(StreamRecorderErrorCode error, StreamRecorderState current, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate void BufferConsumedCallback(IntPtr buffer, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate bool VideoResolutionCallback(int width, int height, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate bool FileFormatCallback(StreamRecorderFileFormat format, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate bool AudioEncoderCallback(StreamRecorderAudioCodec codec, IntPtr userData);
-
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        internal delegate bool VideoEncoderCallback(StreamRecorderVideoCodec codec, IntPtr userData);
-
-        /* begin of method */
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_create")]
-        internal static extern int Create(out IntPtr handle);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_destroy")]
-        internal static extern int Destroy(IntPtr handle);
+        internal static extern StreamRecorderErrorCode Create(out StreamRecorderHandle handle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_prepare")]
-        internal static extern int Prepare(IntPtr handle);
+        internal static extern StreamRecorderErrorCode Prepare(StreamRecorderHandle handle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unprepare")]
-        internal static extern int Unprepare(IntPtr handle);
+        internal static extern StreamRecorderErrorCode Unprepare(StreamRecorderHandle handle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_start")]
-        internal static extern int Start(IntPtr handle);
+        internal static extern StreamRecorderErrorCode Start(StreamRecorderHandle handle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_pause")]
-        internal static extern int Pause(IntPtr handle);
+        internal static extern StreamRecorderErrorCode Pause(StreamRecorderHandle handle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_commit")]
-        internal static extern int Commit(IntPtr handle);
+        internal static extern StreamRecorderErrorCode Commit(StreamRecorderHandle handle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_cancel")]
-        internal static extern int Cancel(IntPtr handle);
+        internal static extern StreamRecorderErrorCode Cancel(StreamRecorderHandle handle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_push_stream_buffer")]
-        internal static extern int PushStreamBuffer(IntPtr handle, IntPtr/*  media_packet_h */ inbuf);
+        internal static extern StreamRecorderErrorCode PushStreamBuffer(StreamRecorderHandle handle,
+            IntPtr mediaPacketHandle);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_enable_source_buffer")]
-        internal static extern int EnableSourceBuffer(IntPtr handle, int type);
+        internal static extern StreamRecorderErrorCode EnableSourceBuffer(StreamRecorderHandle handle,
+            StreamRecorderSourceType type);
 
         [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_state")]
-        internal static extern int GetState(IntPtr handle, out int state);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_filename")]
-        internal static extern int SetFileName(IntPtr handle, string path);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_filename")]
-        internal static extern int GetFileName(IntPtr handle, out IntPtr path);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_file_format")]
-        internal static extern int SetFileFormat(IntPtr handle, int format);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_file_format")]
-        internal static extern int GetFileFormat(IntPtr handle, out int format);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_encoder")]
-        internal static extern int SetAudioEncoder(IntPtr handle, int codec);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_encoder")]
-        internal static extern int GetAudioEncoder(IntPtr handle, out int codec);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_encoder")]
-        internal static extern int SetVideoEncoder(IntPtr handle, int codec);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_encoder")]
-        internal static extern int GetVideoEncoder(IntPtr handle, out int codec);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_resolution")]
-        internal static extern int SetVideoResolution(IntPtr handle, int width, int height);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_resolution")]
-        internal static extern int GetVideoResolution(IntPtr handle, out int width, out int height);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_framerate")]
-        internal static extern int SetVideoFramerate(IntPtr handle, int framerate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_framerate")]
-        internal static extern int GetVideoFramerate(IntPtr handle, out int framerate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_source_format")]
-        internal static extern int SetVideoSourceFormat(IntPtr handle, int format);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_source_format")]
-        internal static extern int GetVideoSourceFormat(IntPtr handle, out int format);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_recording_limit")]
-        internal static extern int SetRecordingLimit(IntPtr handle, int type, int limit);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_recording_limit")]
-        internal static extern int GetRecordingLimit(IntPtr handle, int type, out int format);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_samplerate")]
-        internal static extern int SetAudioSampleRate(IntPtr handle, int samplerate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_samplerate")]
-        internal static extern int GetAudioSampleRate(IntPtr handle, out int samplerate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_encoder_bitrate")]
-        internal static extern int SetAudioEncoderBitrate(IntPtr handle, int bitrate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_encoder_bitrate")]
-        internal static extern int GetAudioEncoderBitrate(IntPtr handle, out int bitrate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_video_encoder_bitrate")]
-        internal static extern int SetVideoEncoderBitrate(IntPtr handle, int bitrate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_video_encoder_bitrate")]
-        internal static extern int GetVideoEncoderBitrate(IntPtr handle, out int bitrate);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_audio_channel")]
-        internal static extern int SetAudioChannel(IntPtr handle, int channel);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_get_audio_channel")]
-        internal static extern int GetAudioChannel(IntPtr handle, out int channel);
-        /* End of method */
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_file_format")]
-        internal static extern int FileFormats(IntPtr handle, FileFormatCallback callback, IntPtr userData);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_audio_encoder")]
-        internal static extern int AudioEncoders(IntPtr handle, AudioEncoderCallback callback, IntPtr userData);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_video_encoder")]
-        internal static extern int VideoEncoders(IntPtr handle, VideoEncoderCallback callback, IntPtr userData);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_foreach_supported_video_resolution")]
-        internal static extern int VideoResolution(IntPtr handle, VideoResolutionCallback callback, IntPtr userData);
-        /* End of foreach method */
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_notify_cb")]
-        internal static extern int SetNotifiedCallback(IntPtr handle, NotifiedCallback callback, IntPtr userData);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_notify_cb")]
-        internal static extern int UnsetNotifiedCallback(IntPtr handle);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_recording_status_cb")]
-        internal static extern int SetStatusChangedCallback(IntPtr handle, RecordingStatusCallback callback, IntPtr userData);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_recording_status_cb")]
-        internal static extern int UnsetStatusChangedCallback(IntPtr handle);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_recording_limit_reached_cb")]
-        internal static extern int SetLimitReachedCallback(IntPtr handle, RecordingLimitReachedCallback callback, IntPtr userData);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_recording_limit_reached_cb")]
-        internal static extern int UnsetLimitReachedCallback(IntPtr handle);
-
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_error_cb")]
-        internal static extern int SetErrorCallback(IntPtr handle, RecorderErrorCallback callback, IntPtr userData);
+        internal static extern StreamRecorderErrorCode GetState(StreamRecorderHandle handle, out RecorderState state);
+    }
 
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_error_cb")]
-        internal static extern int UnsetErrorCallback(IntPtr handle);
+    internal class StreamRecorderHandle : SafeHandle
+    {
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_destroy")]
+        private static extern StreamRecorderErrorCode Destroy(IntPtr handle);
 
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_set_buffer_consume_completed_cb")]
-        internal static extern int SetBufferConsumedCallback(IntPtr handle, BufferConsumedCallback callback, IntPtr userDat);
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_cancel")]
+        private static extern StreamRecorderErrorCode Cancel(IntPtr handle);
 
-        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unset_buffer_consume_completed_cb")]
-        internal static extern int UnsetBufferConsumedCallback(IntPtr handle);
+        [DllImport(Libraries.StreamRecorder, EntryPoint = "streamrecorder_unprepare")]
+        private static extern StreamRecorderErrorCode Unprepare(IntPtr handle);
+
+        protected StreamRecorderHandle() : base(IntPtr.Zero, true)
+        {
+        }
+
+        public override bool IsInvalid => handle == IntPtr.Zero;
+
+        protected override bool ReleaseHandle()
+        {
+            try
+            {
+                Cancel(handle).Ignore(StreamRecorderErrorCode.InvalidState).ThrowIfError("Failed to cancel.");
+                Unprepare(handle).Ignore(StreamRecorderErrorCode.InvalidState).ThrowIfError("Failed to unprepare.");
+                Destroy(handle).ThrowIfError("Failed to destory.");
+
+                return true;
+            }
+            catch (Exception e)
+            {
+                Tizen.Log.Debug(GetType().FullName, $"Failed to release native RecorderHandle; {e.Message}");
+
+                return false;
+            }
+        }
     }
 }
diff --git a/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorder.Capabilities.cs b/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorder.Capabilities.cs
new file mode 100644 (file)
index 0000000..4ba2137
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Native = Interop.StreamRecorder;
+
+namespace Tizen.Multimedia
+{
+    public partial class StreamRecorder
+    {
+        internal void LoadCapabilities()
+        {
+            _videoCodecs = LoadVideoCodecs(this);
+            _audioCodecs = LoadAudioCodecs(this);
+            _fileFormats = LoadFileFormats(this);
+            _videoResolutions = LoadResolutions(this);
+        }
+
+        private static IEnumerable<RecorderVideoCodec> LoadVideoCodecs(StreamRecorder recorder)
+        {
+            var result = new List<RecorderVideoCodec>();
+            Native.VideoEncoderCallback callback = (codec, _) =>
+            {
+                result.Add(codec.ToRecorderEnum());
+                return true;
+            };
+
+            Native.VideoEncoders(recorder.Handle, callback).ThrowIfError("Failed to get the supported video codecs.");
+
+            return result.AsReadOnly();
+        }
+
+        private static IEnumerable<RecorderAudioCodec> LoadAudioCodecs(StreamRecorder recorder)
+        {
+            var result = new List<RecorderAudioCodec>();
+
+            Native.AudioEncoders(recorder.Handle, (codec, _) =>
+            {
+                result.Add(codec.ToRecorderEnum());
+                return true;
+            }).ThrowIfError("Failed to get the supported audio codecs.");
+
+            return result.AsReadOnly();
+        }
+
+        private static IEnumerable<RecorderFileFormat> LoadFileFormats(StreamRecorder recorder)
+        {
+            var result = new List<RecorderFileFormat>();
+
+            Native.FileFormats(recorder.Handle, (fileFormat, _) =>
+            {
+                result.Add(fileFormat.ToRecorderEnum());
+                return true;
+            }).ThrowIfError("Failed to get the supported file formats.");
+
+            return result.AsReadOnly();
+        }
+
+        private static IEnumerable<Size> LoadResolutions(StreamRecorder recorder)
+        {
+            List<Size> result = new List<Size>();
+
+            Native.VideoResolutionCallback callback = (width, height, _) =>
+            {
+                result.Add(new Size(width, height));
+                return true;
+            };
+
+            Native.VideoResolution(recorder.Handle, callback).
+                ThrowIfError("Failed to get the supported video resolutions.");
+
+            return result.AsReadOnly();
+        }
+
+        private IEnumerable<RecorderFileFormat> _fileFormats;
+
+        /// <summary>
+        /// Gets the file formats that the current device supports.
+        /// </summary>
+        /// <returns>An IEnumerable of <see cref="RecorderFileFormat"/> representing the supported file formats.</returns>
+        public IEnumerable<RecorderFileFormat> GetSupportedFileFormats() => _fileFormats;
+
+        private IEnumerable<RecorderAudioCodec> _audioCodecs;
+
+        /// <summary>
+        /// Gets the audio codecs that the current device supports.
+        /// </summary>
+        /// <returns>An IEnumerable of <see cref="RecorderAudioCodec"/> representing the supported audio codecs.</returns>
+        public IEnumerable<RecorderAudioCodec> GetSupportedAudioCodecs() => _audioCodecs;
+
+        private IEnumerable<RecorderVideoCodec> _videoCodecs;
+
+        /// <summary>
+        /// Gets the video codecs that the current device supports.
+        /// </summary>
+        /// <returns>An IEnumerable of <see cref="RecorderVideoCodec"/> representing the supported video codecs.</returns>
+        public IEnumerable<RecorderVideoCodec> GetSupportedVideoCodecs() => _videoCodecs;
+
+        private IEnumerable<Size> _videoResolutions;
+
+        /// <summary>
+        /// Gets the video resolutions that the current device supports.
+        /// </summary>
+        /// <returns>An IEnumerable of <see cref="Size"/> representing the supported resolutions.</returns>
+        public IEnumerable<Size> GetSupportedVideoResolutions() => _videoResolutions;
+
+        internal void ValidateFileFormat(RecorderFileFormat format)
+        {
+            if (_fileFormats.Contains(format) == false)
+            {
+                throw new NotSupportedException($"{format.ToString()} is not supported.");
+            }
+        }
+
+        internal void ValidateAudioCodec(RecorderAudioCodec codec)
+        {
+            if (_audioCodecs.Contains(codec) == false)
+            {
+                throw new NotSupportedException($"{codec.ToString()} is not supported.");
+            }
+        }
+
+        internal void ValidateVideoCodec(RecorderVideoCodec codec)
+        {
+            if (_videoCodecs.Contains(codec) == false)
+            {
+                throw new NotSupportedException($"{codec.ToString()} is not supported.");
+            }
+        }
+
+        internal void ValidateVideoResolution(Size resolution)
+        {
+            if (_videoResolutions.Contains(resolution) == false)
+            {
+                throw new NotSupportedException($"Resolution({resolution.ToString()}) is not supported.");
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorder.Events.cs b/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorder.Events.cs
new file mode 100644 (file)
index 0000000..647e3ab
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Diagnostics;
+using Native = Interop.StreamRecorder;
+
+namespace Tizen.Multimedia
+{
+    public partial class StreamRecorder
+    {
+        /// <summary>
+        /// Occurs when <see cref="StreamRecorder"/> state is changed.
+        /// </summary>
+        public event EventHandler<StreamRecorderStateChangedEventArgs> StateChanged;
+
+
+        /// <summary>
+        /// Occurs when a buffer had consumed completely.
+        /// </summary>
+        public event EventHandler<StreamRecorderBufferConsumedEventArgs> BufferConsumed;
+
+        /// <summary>
+        /// Occurs when recording status is changed.
+        /// </summary>
+        public event EventHandler<RecordingStatusChangedEventArgs> RecordingStatusChanged;
+
+        /// <summary>
+        /// Occurs when recording limit is reached.
+        /// </summary>
+        public event EventHandler<RecordingLimitReachedEventArgs> RecordingLimitReached;
+
+        /// <summary>
+        /// Occurs when an error occurred during a recorder operation.
+        /// </summary>
+        public event EventHandler<StreamRecorderErrorOccurredEventArgs> ErrorOccurred;
+
+        private Native.RecordingLimitReachedCallback _recordingLimitReachedCallback;
+        private Native.RecorderErrorCallback _recorderErrorCallback;
+        private Native.RecordingStatusCallback _recordingStatusCallback;
+        private Native.BufferConsumedCallback _bufferConsumedCallback;
+        private Native.NotifiedCallback _notifiedCallback;
+
+        private void RegisterStreamRecorderNotifiedEvent()
+        {
+            _notifiedCallback = (previous, current, notify, _) =>
+            {
+                if (previous == 0)
+                {
+                    return;
+                }
+
+                StateChanged?.Invoke(this, new StreamRecorderStateChangedEventArgs(
+                    (RecorderState)previous, (RecorderState)current));
+            };
+
+            Native.SetNotifiedCallback(_handle, _notifiedCallback).
+                ThrowIfError("Failed to initialize state changed event.");
+        }
+
+        private void RegisterBufferConsumedEvent()
+        {
+            _bufferConsumedCallback = (lockedPacketHandle, _) =>
+            {
+                MediaPacket packet = null;
+
+                // Lock must be disposed here, note that the packet won't be disposed.
+                using (MediaPacket.Lock packetLock =
+                    MediaPacket.Lock.FromHandle(lockedPacketHandle))
+                {
+                    Debug.Assert(packetLock != null);
+
+                    packet = packetLock.MediaPacket;
+                }
+
+                BufferConsumed?.Invoke(this, new StreamRecorderBufferConsumedEventArgs(packet));
+            };
+
+            Native.SetBufferConsumedCallback(_handle, _bufferConsumedCallback).
+                ThrowIfError("Failed to initialize buffer consumed event.");
+        }
+
+        private void RegisterRecordingStatusChangedEvent()
+        {
+            _recordingStatusCallback = (elapsedTime, fileSize, _) =>
+            {
+                RecordingStatusChanged?.Invoke(this, new RecordingStatusChangedEventArgs((long)elapsedTime, (long)fileSize));
+            };
+            Native.SetStatusChangedCallback(_handle, _recordingStatusCallback).
+                ThrowIfError("Failed to initialize status changed event.");
+        }
+
+        private void RegisterRecordingLimitReachedEvent()
+        {
+            _recordingLimitReachedCallback = (type, _) =>
+            {
+                RecordingLimitReached?.Invoke(this, new RecordingLimitReachedEventArgs(type));
+            };
+
+            Native.SetLimitReachedCallback(_handle, _recordingLimitReachedCallback).
+                ThrowIfError("Failed to initialize limit reached event.");
+        }
+
+        private void RegisterRecordingErrorOccurredEvent()
+        {
+            _recorderErrorCallback = (error, currentState, _) =>
+            {
+                ErrorOccurred?.Invoke(this, new StreamRecorderErrorOccurredEventArgs(
+                    error == StreamRecorderErrorCode.OutOfStorage ?
+                    StreamRecorderError.OutOfStorage : StreamRecorderError.InternalError, currentState));
+            };
+            Native.SetErrorCallback(_handle, _recorderErrorCallback).
+                ThrowIfError("Failed to set error callback");
+        }
+    }
+}
index 91cf1ee..99fd6d8 100644 (file)
  */
 
 using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-using Tizen.Internals.Errors;
+using System.Diagnostics;
+using System.Linq;
+using NativeHandle = Interop.StreamRecorderHandle;
 using Native = Interop.StreamRecorder;
 
 namespace Tizen.Multimedia
 {
-    static internal class StreamRecorderLog
-    {
-        internal const string Tag = "Tizen.Multimedia.StreamRecorder";
-    }
-
     /// <summary>
-    /// Provides methods to control stream recorder.
+    /// Provides the ability to record user buffer from application.
     /// </summary>
-    /// <remarks>
-    /// StreamRecorder class provides functions to record raw image frame
-    /// also provides recording start, stop and save the content etc.
-    /// </remarks>
-    public class StreamRecorder : IDisposable
+    /// <seealso cref="Recorder"/>
+    public partial class StreamRecorder : IDisposable
     {
-        private IntPtr _handle;
+        private NativeHandle _handle;
         private bool _disposed = false;
-        /// <summary>
-        /// Occurred when recording is progressing for recording status.
-        /// </summary>
-        private EventHandler<RecordingStatusChangedEventArgs> _recordingStatusChanged;
-        private Native.RecordingStatusCallback _recordingStatusCallback;
-        /// <summary>
-        /// Occurred when recording time or size reach limit.
-        /// </summary>
-        private EventHandler<StreamRecordingLimitReachedEventArgs> _recordingLimitReached;
-        private Native.RecordingLimitReachedCallback _recordingLimitReachedCallback;
-        /// <summary>
-        /// Occurred when streamrecorder complete to use pushed buffer.
-        /// </summary>
-        private EventHandler<StreamRecordingBufferConsumedEventArgs> _bufferConsumed;
-        private Native.BufferConsumedCallback _bufferConsumedCallback;
-        /// <summary>
-        /// Occurred when streamrecorder state is changed.
-        /// </summary>
-        private EventHandler<StreamRecorderNotifiedEventArgs> _recorderNotified;
-        private Native.NotifiedCallback _notifiedCallback;
-        /// <summary>
-        /// Occurred when error is occured.
-        /// </summary>
-        private EventHandler<StreamRecordingErrorOccurredEventArgs> _recordingErrorOccurred;
-        private Native.RecorderErrorCallback _recorderErrorCallback;
 
-        private List<StreamRecorderFileFormat> _formats;
-        private List<StreamRecorderAudioCodec> _audioCodec;
-        private List<StreamRecorderVideoCodec> _videoCodec;
-        private List<StreamRecorderVideoResolution> _resolutions;
-        StreamRecorderVideoResolution _videoResolution = null;
+        private bool _audioEnabled;
+        private bool _videoEnabled;
+        private StreamRecorderVideoFormat _sourceFormat;
 
         /// <summary>
-        /// Stream recorder constructor.
+        /// Initialize a new instance of the <see cref="StreamRecorder"/> class.
         /// </summary>
+        /// <exception cref="NotSupportedException">The feature is not supported.</exception>
         public StreamRecorder()
         {
-            int ret = Native.Create(out _handle);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to create stream recorder");
-            }
-            _formats = new List<StreamRecorderFileFormat>();
-            _audioCodec = new List<StreamRecorderAudioCodec>();
-            _videoCodec = new List<StreamRecorderVideoCodec>();
-            _resolutions = new List<StreamRecorderVideoResolution>();
-            _videoResolution = new StreamRecorderVideoResolution(_handle);
-        }
-
-        /// <summary>
-        /// Stream recorder destructor.
-        /// </summary>
-        ~StreamRecorder()
-        {
-            Dispose(false);
-        }
-
-        /// <summary>
-        /// Event that occurs when streamrecorder state is changed.
-        /// </summary>
-        public event EventHandler<StreamRecorderNotifiedEventArgs> RecorderNotified
-        {
-            add
-            {
-                if (_recorderNotified == null)
-                {
-                    RegisterStreamRecorderNotifiedEvent();
-                }
-                _recorderNotified += value;
-            }
-            remove
-            {
-                _recorderNotified -= value;
-                if (_recorderNotified == null)
-                {
-                    UnregisterStreamRecorderNotifiedEvent();
-                }
-            }
-        }
-
-        /// <summary>
-        /// Event that occurs when buffer had comsumed completely.
-        /// </summary>
-        public event EventHandler<StreamRecordingBufferConsumedEventArgs> BufferConsumed
-        {
-            add
+            try
             {
-                if (_bufferConsumed == null)
-                {
-                    RegisterBufferComsumedEvent();
-                }
-                _bufferConsumed += value;
+                Native.Create(out _handle).ThrowIfError("Failed to create stream recorder.");
             }
-            remove
+            catch (TypeLoadException)
             {
-                _bufferConsumed -= value;
-                if (_bufferConsumed == null)
-                {
-                    UnregisterBufferComsumedEvent();
-                }
-            }
-        }
-
-        /// <summary>
-        /// Event that occurs when recording status changed.
-        /// </summary>
-        public event EventHandler<RecordingStatusChangedEventArgs> RecordingStatusChanged
-        {
-            add
-            {
-                if (_recordingStatusChanged == null)
-                {
-                    RegisterRecordingStatusChangedEvent();
-                }
-                _recordingStatusChanged += value;
-            }
-            remove
-            {
-                _recordingStatusChanged -= value;
-                if (_recordingStatusChanged == null)
-                {
-                    UnregisterRecordingStatusChangedEvent();
-                }
+                throw new NotSupportedException("StreamRecorder is not supported.");
             }
-        }
 
-        /// <summary>
-        /// Event that occurs when recording limit is reached.
-        /// </summary>
-        public event EventHandler<StreamRecordingLimitReachedEventArgs> RecordingLimitReached
-        {
-            add
-            {
-                if (_recordingLimitReached == null)
-                {
-                    RegisterRecordingLimitReachedEvent();
-                }
-                _recordingLimitReached += value;
-            }
-            remove
-            {
-                _recordingLimitReached -= value;
-                if (_recordingLimitReached == null)
-                {
-                    UnregisterRecordingLimitReachedEvent();
-                }
-            }
-        }
+            LoadCapabilities();
 
-        /// <summary>
-        /// Event that occurs when an error occured during recorder operation.
-        /// </summary>
-        public event EventHandler<StreamRecordingErrorOccurredEventArgs> RecordingErrorOccurred
-        {
-            add
-            {
-                if (_recordingErrorOccurred == null)
-                {
-                    RegisterRecordingErrorOccurredEvent();
-                }
-                _recordingErrorOccurred += value;
-            }
-            remove
-            {
-                _recordingErrorOccurred -= value;
-                if (_recordingErrorOccurred == null)
-                {
-                    UnregisterRecordingErrorOccurredEvent();
-                }
-            }
+            RegisterStreamRecorderNotifiedEvent();
+            RegisterBufferConsumedEvent();
+            RegisterRecordingStatusChangedEvent();
+            RegisterRecordingErrorOccurredEvent();
+            RegisterRecordingLimitReachedEvent();
         }
 
-        /// <summary>
-        /// The file path to record.
-        /// </summary>
-        /// <remarks>
-        /// If the same file already exists in the file system, then old file
-        /// will be overwritten.
-        /// </remarks>
-        public string FilePath
+        internal NativeHandle Handle
         {
             get
             {
-                IntPtr val;
-                int ret = Native.GetFileName(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
+                if (_disposed)
                 {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get filepath, " + (StreamRecorderError)ret);
+                    throw new ObjectDisposedException(nameof(StreamRecorder));
                 }
-                string result = Marshal.PtrToStringAnsi(val);
-                LibcSupport.Free(val);
-                return result;
-            }
-            set
-            {
-                int ret = Native.SetFileName(_handle, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set filepath, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret, "Failed to set filepath");
-                }
-            }
-        }
-
-        /// <summary>
-        /// Get the current state of the stream recorder.
-        /// </summary>
-        /// <value> The current state of stream recorder.
-        public StreamRecorderState State
-        {
-            get
-            {
-                int val = 0;
 
-                int ret = Native.GetState(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get stream recorder state, " + (StreamRecorderError)ret);
-                }
-                return (StreamRecorderState)val;
+                return _handle;
             }
         }
 
         /// <summary>
-        /// Get/Set the file format for recording media stream.
+        /// Gets the current state of the stream recorder.
         /// </summary>
-        /// <remarks>
-        /// Must set <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>.
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// </remarks>
-        /// <exception cref="ArgumentException">The format does not valid.</exception>
-        /// <seealso cref="SupportedFileFormats"/>
-        public StreamRecorderFileFormat FileFormat
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
+        public RecorderState State
         {
             get
             {
-                int val = 0;
-
-                int ret = Native.GetFileFormat(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get file format, " + (StreamRecorderError)ret);
-                }
-                return (StreamRecorderFileFormat)val;
-            }
-            set
-            {
-                int ret = Native.SetFileFormat(_handle, (int)value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set file format, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret);
-                }
-            }
-        }
+                Native.GetState(Handle, out var val).ThrowIfError("Failed to get the stream recorder state.");
 
-        /// <summary>
-        /// The audio codec for encoding an audio stream.
-        /// </summary>
-        /// <remarks>
-        /// Must set <see cref="StreamRecorderSourceType.Audio"/> or <see cref="StreamRecorderSourceType.VideoAudio"/>
-        /// by <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>
-        /// </remarks>
-        /// <exception cref="ArgumentException">The codec does not valid.</exception>
-        /// <seealso cref="SupportedAudioEncodings"/>
-        public StreamRecorderAudioCodec AudioCodec
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetAudioEncoder(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get audio codec, " + (StreamRecorderError)ret);
-                }
-                return (StreamRecorderAudioCodec)val;
-            }
-            set
-            {
-                int ret = Native.SetAudioEncoder(_handle, (int)value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set audio codec, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret);
-                }
-            }
-        }
-
-        /// <summary>
-        /// The video codec for encoding video stream.
-        /// </summary>
-        /// <remarks>
-        /// Must set <see cref="StreamRecorderSourceType.Video"/> or <see cref="StreamRecorderSourceType.VideoAudio"/>
-        /// by <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>
-        /// </remarks>
-        /// <exception cref="ArgumentException">The codec does not valid.</exception>
-        /// <seealso cref="SupportedVideoEncodings"/>
-        public StreamRecorderVideoCodec VideoCodec
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetVideoEncoder(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get video codec, " + (StreamRecorderError)ret);
-                }
-                return (StreamRecorderVideoCodec)val;
-            }
-            set
-            {
-                int ret = Native.SetVideoEncoder(_handle, (int)value);
-
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set video codec, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret);
-                }
-            }
-        }
-
-        /// <summary>
-        /// The maximum size of a recording file in KB(kilobytes). If 0, means
-        /// unlimited recording size.
-        /// </summary>
-        /// <remarks>
-        /// After reaching the limitation, the data which is being recorded will
-        /// be discarded and not written to the file.
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// </remarks>
-        /// <exception cref="ArgumentException">The value set to below 0.</exception>
-        /// <seealso cref="StreamRecordingLimitReachedEventArgs"/>
-        public int SizeLimit
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetRecordingLimit(_handle, 1, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get size limit, " + (StreamRecorderError)ret);
-                }
                 return val;
             }
-            set
-            {
-                int ret = Native.SetRecordingLimit(_handle, 1, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set sizelimit, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret, "Failed to set size limit");
-                }
-            }
         }
 
-        /// <summary>
-        /// The time limit of a recording file in Seconds. If 0, means unlimited recording
-        /// time.
-        /// </summary>
-        /// <remarks>
-        /// After reaching the limitation, the data which is being recorded will
-        /// be discarded and not written to the file.
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// </remarks>
-        /// <exception cref="ArgumentException">The value set to below 0.</exception>
-        /// <seealso cref="StreamRecordingLimitReachedEventArgs"/>
-        public int TimeLimit
+        private void ValidateState(params RecorderState[] required)
         {
-            get
-            {
-                int val = 0;
+            Debug.Assert(required.Length > 0);
 
-                int ret = Native.GetRecordingLimit(_handle, 0, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get time limit, " + (StreamRecorderError)ret);
-                }
-                return val;
-            }
-            set
+            var curState = State;
+            if (!required.Contains(curState))
             {
-                int ret = Native.SetRecordingLimit(_handle, 0, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set timelimit, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret, "Failed to set time limit");
-                }
+                throw new InvalidOperationException($"The stream recorder is not in a valid state. " +
+                    $"Current State : { curState }, Valid State : { string.Join(", ", required) }.");
             }
         }
 
+        #region Operation methods
         /// <summary>
-        /// The sampling rate of an audio stream in hertz.
+        /// Prepares the stream recorder with the specified options.
         /// </summary>
-        /// <remarks>
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// Must set <see cref="StreamRecorderSourceType.Audio"/> or <see cref="StreamRecorderSourceType.VideoAudio"/>
-        /// by <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>.
-        /// </remarks>
-        /// <exception cref="ArgumentException">The value set to below 0.</exception>
-        public int AudioSampleRate
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetAudioSampleRate(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get audio samplerate, " + (StreamRecorderError)ret);
-                }
-                return val;
-            }
-            set
-            {
-                int ret = Native.SetAudioSampleRate(_handle, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set audio samplerate, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret, "Failed to set audio samplerate");
-                }
-            }
-        }
-
-        /// <summary>
-        /// The bitrate of an audio encoder in bits per second.
-        /// </summary>
-        /// <remarks>
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// Must set <see cref="StreamRecorderSourceType.Audio"/> or <see cref="StreamRecorderSourceType.VideoAudio"/>
-        /// by <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>
-        /// </remarks>
-        /// <exception cref="ArgumentException">The value set to below 0.</exception>
-        public int AudioBitRate
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetAudioEncoderBitrate(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get audio bitrate, " + (StreamRecorderError)ret);
-                }
-                return val;
-            }
-            set
-            {
-                int ret = Native.SetAudioEncoderBitrate(_handle, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set audio bitrate, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret, "Failed to set audio bitrate");
-                }
-            }
-        }
-
-        /// <summary>
-        /// The bitrate of an video encoder in bits per second.
-        /// </summary>
-        /// <remarks>
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// Must set <see cref="StreamRecorderSourceType.Video"/> or <see cref="StreamRecorderSourceType.VideoAudio"/>
-        /// by <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>
-        /// </remarks>
-        /// <exception cref="ArgumentException">The value set to below 0.</exception>
-        public int VideoBitRate
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetVideoEncoderBitrate(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get video bitrate, " + (StreamRecorderError)ret);
-                }
-                return val;
-            }
-            set
-            {
-                int ret = Native.SetVideoEncoderBitrate(_handle, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set video bitrate, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret, "Failed to set video bitrate");
-                }
-            }
-        }
-
-        /// <summary>
-        /// The video frame rate for recording media stream.
-        /// </summary>
-        /// <remarks>
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// Must set <see cref="StreamRecorderSourceType.Video"/> or <see cref="StreamRecorderSourceType.VideoAudio"/>
-        /// by <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>
-        /// </remarks>
-        /// <exception cref="NotSupportedException">The value set to below 0.</exception>
-        public int VideoFrameRate
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetVideoFramerate(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get video framerate, " + (StreamRecorderError)ret);
-                }
-                return val;
-            }
-            set
-            {
-                int ret = Native.SetVideoFramerate(_handle, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set video framerate, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Get or Set the video source format for recording media stream.
-        /// </summary>
-        /// <exception cref="ArgumentException">The value set to a invalid value.</exception>
-        /// <seealso cref="StreamRecorderVideoSourceFormat"/>
-        public StreamRecorderVideoSourceFormat VideoSourceFormat
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetVideoSourceFormat(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get video framerate, " + (StreamRecorderError)ret);
-                }
-                return (StreamRecorderVideoSourceFormat)val;
-            }
-            set
-            {
-                int ret = Native.SetVideoSourceFormat(_handle, (int)value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set video framerate, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret);
-                }
-            }
-        }
-
-        /// <summary>
-        /// The number of audio channel.
-        /// </summary>
-        /// <remarks>
-        /// The attribute is applied only in Created state.
-        /// For mono recording, set channel to 1.
-        /// For stereo recording, set channel to 2.
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// </remarks>
-        /// <exception cref="ArgumentException">The value set to a invalid value.</exception>
-        public int AudioChannel
-        {
-            get
-            {
-                int val = 0;
-
-                int ret = Native.GetAudioChannel(_handle, out val);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to get audio channel, " + (StreamRecorderError)ret);
-                }
-                return val;
-            }
-            set
-            {
-                int ret = Native.SetAudioChannel(_handle, value);
-                if ((StreamRecorderError)ret != StreamRecorderError.None)
-                {
-                    Log.Error(StreamRecorderLog.Tag, "Failed to set audio channel, " + (StreamRecorderError)ret);
-                    StreamRecorderErrorFactory.ThrowException(ret, "Failed to set audio channel");
-                }
-            }
-        }
-
-        /// <summary>
-        /// Video resolution of the video recording.
-        /// </summary>
-        /// <remarks>
-        /// Must set <see cref="StreamRecorderSourceType.Video"/> or <see cref="StreamRecorderSourceType.VideoAudio"/>
-        /// by <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>
-        /// The recorder state must be <see cref="StreamRecorderState.Created"/> state.
-        /// </remarks>
-        /// <exception cref="ArgumentException">The value set to a invalid value.</exception>
-        /// <seealso cref="SupportedVideoResolutions"/>
-        public StreamRecorderVideoResolution Resolution
+        /// <remarks>The recorder must be <see cref="RecorderState.Idle"/>.</remarks>
+        /// <param name="options">The options for recording.</param>
+        /// <exception cref="InvalidOperationException">The recorder is not in the valid state.</exception>
+        /// <exception cref="ArgumentException">Both <see cref="StreamRecorderOptions.Audio"/> and
+        ///     <see cref="StreamRecorderOptions.Video"/> are null.
+        /// </exception>
+        /// <exception cref="NotSupportedException"><paramref name="options"/> contains a value which is not supported.</exception>
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
+        /// <seealso cref="Unprepare"/>
+        /// <seealso cref="Start"/>
+        /// <seealso cref="StreamRecorderOptions"/>
+        /// <seealso cref="StreamRecorderAudioOptions"/>
+        /// <seealso cref="StreamRecorderVideoOptions"/>
+        public void Prepare(StreamRecorderOptions options)
         {
-            get
+            if (options == null)
             {
-                return _videoResolution;
+                throw new ArgumentNullException(nameof(options));
             }
-        }
 
-        /// <summary>
-        /// Retrieves all the file formats supported by the stream recorder.
-        /// </summary>
-        /// <returns>
-        /// It returns a list containing all the supported file
-        /// formats by Stream recorder.
-        /// </returns>
-        /// <seealso cref="StreamRecorderFileFormat"/>
-        public IEnumerable<StreamRecorderFileFormat> SupportedFileFormats
-        {
-            get
-            {
-                if (_formats.Count == 0)
-                {
-                    Native.FileFormatCallback callback = (StreamRecorderFileFormat format, IntPtr userData) =>
-                    {
-                        _formats.Add(format);
-                        return true;
-                    };
-                    int ret = Native.FileFormats(_handle, callback, IntPtr.Zero);
-                    if (ret != (int)StreamRecorderError.None)
-                    {
-                        StreamRecorderErrorFactory.ThrowException(ret, "Failed to get the supported fileformats");
-                    }
-                }
-                return _formats;
-            }
-        }
+            ValidateState(RecorderState.Idle);
 
-        /// <summary>
-        /// Retrieves all the audio encoders supported by the recorder.
-        /// </summary>
-        /// <returns>
-        /// It returns a list containing all the supported audio encoders
-        /// by recorder.
-        /// </returns>
-        /// <seealso cref="StreamRecorderAudioCodec"/>
-        public IEnumerable<StreamRecorderAudioCodec> SupportedAudioEncodings
-        {
-            get
-            {
-                if (_audioCodec.Count == 0)
-                {
-                    Native.AudioEncoderCallback callback = (StreamRecorderAudioCodec codec, IntPtr userData) =>
-                    {
-                        _audioCodec.Add(codec);
-                        return true;
-                    };
-                    int ret = Native.AudioEncoders(_handle, callback, IntPtr.Zero);
-                    if (ret != (int)StreamRecorderError.None)
-                    {
-                        StreamRecorderErrorFactory.ThrowException(ret, "Failed to get the supported audio encoders");
-                    }
-                }
-                return _audioCodec;
-            }
-        }
+            options.Apply(this);
 
-        /// <summary>
-        /// Retrieves all the video encoders supported by the recorder.
-        /// </summary>
-        /// <returns>
-        /// It returns a list containing all the supported video encoders
-        /// by recorder.
-        /// </returns>
-        /// <seealso cref="StreamRecorderVideoCodec"/>
-        public IEnumerable<StreamRecorderVideoCodec> SupportedVideoEncodings
-        {
-            get
-            {
-                if (_videoCodec.Count == 0)
-                {
-                    Native.VideoEncoderCallback callback = (StreamRecorderVideoCodec codec, IntPtr userData) =>
-                    {
-                        _videoCodec.Add(codec);
-                        return true;
-                    };
-                    int ret = Native.VideoEncoders(_handle, callback, IntPtr.Zero);
-                    if (ret != (int)StreamRecorderError.None)
-                    {
-                        StreamRecorderErrorFactory.ThrowException(ret, "Failed to get the supported video encoders");
-                    }
-                }
-                return _videoCodec;
-            }
-        }
+            Native.Prepare(Handle).ThrowIfError("Failed to prepare stream recorder.");
 
-        /// <summary>
-        /// Retrieves all the video resolutions supported by the recorder.
-        /// </summary>
-        /// <returns>
-        /// It returns videoresolution list containing the width and height of
-        /// different resolutions supported by recorder.
-        /// </returns>
-        /// <seealso cref="StreamRecorderVideoResolution"/>
-        public IEnumerable<StreamRecorderVideoResolution> SupportedVideoResolutions
-        {
-            get
-            {
-                if (_resolutions.Count == 0)
-                {
-                    Native.VideoResolutionCallback callback = (int width, int height, IntPtr userData) =>
-                    {
-                        StreamRecorderVideoResolution temp = new StreamRecorderVideoResolution(width, height);
-                        _resolutions.Add(temp);
-                        return true;
-                    };
-                    int ret = Native.VideoResolution(_handle, callback, IntPtr.Zero);
-                    if (ret != (int)StreamRecorderError.None)
-                    {
-                        StreamRecorderErrorFactory.ThrowException(ret, "Failed to get the supported video resolutions");
-                    }
-                }
-                return _resolutions;
-            }
-        }
+            _audioEnabled = options.Audio != null;
+            _videoEnabled = options.Video != null;
 
-        /// <summary>
-        /// Prepare the stream recorder.
-        /// </summary>
-        /// <remarks>
-        /// Before calling the function, it is required to set <see cref="StreamRecorder.EnableSourceBuffer(StreamRecorderSourceType)"/>,
-        /// <see cref="StreamRecorderAudioCodec"/>, <see cref="StreamRecorderVideoCodec"/> and <see cref="StreamRecorderFileFormat"/> properties of recorder.
-        /// </remarks>
-        /// <exception cref="InvalidOperationException">The streamrecorder is not in the valid state.</exception>
-        /// <seealso cref="Unprepare"/>
-        public void Prepare()
-        {
-            int ret = Native.Prepare(_handle);
-            if (ret != (int)StreamRecorderError.None)
+            if (options.Video != null)
             {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to prepare stream recorder");
+                _sourceFormat = options.Video.SourceFormat;
             }
         }
 
         /// <summary>
-        /// Resets the stream recorder.
+        /// Unprepares the stream recorder.
         /// </summary>
         /// <remarks>
-        /// The recorder state must be <see cref="StreamRecorderState.Prepared"/> state by <see cref="Prepare"/>, <see cref="Cancel"/> and <see cref="Commit"/>.
-        /// The StreamRecorder state will be <see cref="StreamRecorderState.Created"/>.
+        /// The recorder state must be <see cref="RecorderState.Ready"/> state by
+        /// <see cref="Prepare(StreamRecorderOptions)"/>, <see cref="Cancel"/> and <see cref="Commit"/>.\n
+        /// The recorder state will be <see cref="RecorderState.Idle"/>.\n
+        /// \n
+        /// It has no effect if the recorder is already in the <see cref="RecorderState.Idle"/> state.
         /// </remarks>
-        /// <exception cref="InvalidOperationException">The streamrecorder is not in the valid state.</exception>
+        /// <exception cref="InvalidOperationException">The recorder is not in the valid state.</exception>
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
         /// <seealso cref="Prepare"/>
         public void Unprepare()
         {
-            int ret = Native.Unprepare(_handle);
-            if (ret != (int)StreamRecorderError.None)
+            if (State == RecorderState.Idle)
             {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to reset the stream recorder");
+                return;
             }
+
+            ValidateState(RecorderState.Ready);
+
+            Native.Unprepare(Handle).ThrowIfError("Failed to reset the stream recorder.");
         }
 
         /// <summary>
-        /// Starts the recording.
+        /// Starts recording.
         /// </summary>
         /// <remarks>
-        /// If file path has been set to an existing file, this file is removed automatically and updated by new one.
-        ///    The filename should be set before this function is invoked.
-        ///    The recorder state must be <see cref="StreamRecorderState.Prepared"/> state by <see cref="Prepare"/> or
-        ///    <see cref="StreamRecorderState.Paused"/> state by <see cref="Pause"/>.
-        ///    The filename shuild be set by <see cref="FilePath"/>
+        ///    The recorder state must be <see cref="RecorderState.Ready"/> state by
+        ///    <see cref="Prepare(StreamRecorderOptions)"/> or
+        ///    <see cref="RecorderState.Paused"/> state by <see cref="Pause"/>.\n
+        /// \n
+        /// It has no effect if the recorder is already in the <see cref="RecorderState.Recording"/> state.
         /// </remarks>
-        /// <exception cref="InvalidOperationException">The streamrecorder is not in the valid state.</exception>
-        /// <exception cref="UnauthorizedAccessException">The access ot the resources can not be granted.</exception>
+        /// <exception cref="InvalidOperationException">The recorder is not in the valid state.</exception>
+        /// <exception cref="UnauthorizedAccessException">The access of the resources can not be granted.</exception>
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
         /// <seealso cref="Pause"/>
         /// <seealso cref="Commit"/>
         /// <seealso cref="Cancel"/>
-        /// <seealso cref="FilePath"/>
-        /// <seealso cref="FileFormat"/>
         public void Start()
         {
-            int ret = Native.Start(_handle);
-            if (ret != (int)StreamRecorderError.None)
+            if (State == RecorderState.Recording)
             {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to start the stream recorder");
+                return;
             }
+
+            ValidateState(RecorderState.Ready, RecorderState.Paused);
+
+            Native.Start(Handle).ThrowIfError("Failed to start the stream recorder.");
         }
 
         /// <summary>
-        /// Pause the recording.
+        /// Pauses recording.
         /// </summary>
         /// <remarks>
-        /// Recording can be resumed with <see cref="Start"/>.
+        /// Recording can be resumed with <see cref="Start"/>.\n
+        /// \n
+        ///    The recorder state must be <see cref="RecorderState.Recording"/> state by <see cref="Start"/> \n
+        /// \n
+        /// It has no effect if the recorder is already in the <see cref="RecorderState.Paused"/> state.
         /// </remarks>
-        /// <exception cref="InvalidOperationException">The streamrecorder is not in the valid state.</exception>
+        /// <exception cref="InvalidOperationException">The recorder is not in the valid state.</exception>
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
         /// <seealso cref="Start"/>
         /// <seealso cref="Commit"/>
         /// <seealso cref="Cancel"/>
         public void Pause()
         {
-            int ret = Native.Pause(_handle);
-            if (ret != (int)StreamRecorderError.None)
+            if (State == RecorderState.Paused)
             {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to pause the stream recorder");
+                return;
             }
+
+            ValidateState(RecorderState.Recording);
+
+            Native.Pause(Handle).ThrowIfError("Failed to pause the stream recorder.");
         }
 
         /// <summary>
         /// Stops recording and saves the result.
         /// </summary>
         /// <remarks>
-        /// The recorder state must be <see cref="StreamRecorderState.Recording"/> state by <see cref="Start"/> or
-        ///  <see cref="StreamRecorderState.Paused"/> state by <see cref="Pause"/>
-        /// When you want to record audio or video file, you need to add privilege according to rules below additionally.
+        /// The recorder state must be <see cref="RecorderState.Recording"/> state by <see cref="Start"/> or
+        /// <see cref="RecorderState.Paused"/> state by <see cref="Pause"/>.\n
+        /// \n
+        /// The recorder state will be <see cref="RecorderState.Ready"/> after commit.\n
         /// <para>
-        /// http://tizen.org/privilege/mediastorage is needed if input or output path are relevant to media storage.
-        /// http://tizen.org/privilege/externalstorage is needed if input or output path are relevant to external storage.
+        /// http://tizen.org/privilege/mediastorage is needed if the save path are relevant to media storage.
+        /// http://tizen.org/privilege/externalstorage is needed if the save path are relevant to external storage.
         /// </para>
         /// </remarks>
-        /// <exception cref="InvalidOperationException">The streamrecorder is not in the valid state.</exception>
-        /// <exception cref="UnauthorizedAccessException">The access ot the resources can not be granted.</exception>
+        /// <privilege>http://tizen.org/privilege/mediastorage</privilege>
+        /// <privilege>http://tizen.org/privilege/externalstorage</privilege>
+        /// <exception cref="InvalidOperationException">The recorder is not in the valid state.</exception>
+        /// <exception cref="UnauthorizedAccessException">The access to the resources can not be granted.</exception>
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
         /// <seealso cref="Start"/>
         /// <seealso cref="Pause"/>
         public void Commit()
         {
-            int ret = Native.Commit(_handle);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to save the recorded content");
-            }
+            ValidateState(RecorderState.Paused, RecorderState.Recording);
+
+            Native.Commit(Handle).ThrowIfError("Failed to commit.");
         }
 
         /// <summary>
-        /// Cancels the recording.
-        /// The recording data is discarded and not written in the recording file.
+        /// Cancels recording.
+        /// The recording data is discarded and not written.
         /// </summary>
+        /// <remarks>
+        /// The recorder state must be <see cref="RecorderState.Recording"/> state by <see cref="Start"/> or
+        /// <see cref="RecorderState.Paused"/> state by <see cref="Pause"/>.
+        /// </remarks>
+        /// <exception cref="InvalidOperationException">The recorder is not in the valid state.</exception>
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
         /// <seealso cref="Start"/>
         /// <seealso cref="Pause"/>
         public void Cancel()
         {
-            int ret = Native.Cancel(_handle);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to cancel the recording");
-            }
-        }
-
-        /// <summary>
-        /// Push stream buffer as recording raw data.
-        /// </summary>
-        public void PushBuffer(MediaPacket packet)
-        {
-            IntPtr _packet_h = packet.GetHandle();
+            ValidateState(RecorderState.Paused, RecorderState.Recording);
 
-            Log.Info("Tizen.Multimedia.StreamRecorder", "PUSH stream buffer");
-            int ret = Native.PushStreamBuffer(_handle, _packet_h);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to push buffer");
-            }
-            Log.Info("Tizen.Multimedia.StreamRecorder", "PUSH stream buffer END");
+            Native.Cancel(Handle).ThrowIfError("Failed to cancel recording.");
         }
 
-        /// <summary>
-        /// Set the source type of pushed data.
-        /// </summary>
-        public void EnableSourceBuffer(StreamRecorderSourceType type)
+        private static bool AreVideoTypesMatched(StreamRecorderVideoFormat videoFormat, MediaFormatVideoMimeType mimeType)
         {
-            int ret = Native.EnableSourceBuffer(_handle, (int)type);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Failed to set EnableSourceBuffer");
-            }
+            return (videoFormat == StreamRecorderVideoFormat.Nv12 && mimeType == MediaFormatVideoMimeType.NV12) ||
+                (videoFormat == StreamRecorderVideoFormat.Nv21 && mimeType == MediaFormatVideoMimeType.NV21) ||
+                (videoFormat == StreamRecorderVideoFormat.I420 && mimeType == MediaFormatVideoMimeType.I420);
         }
 
         /// <summary>
-        /// Release any unmanaged resources used by this object.
+        /// Pushes a packet as recording raw data.
         /// </summary>
-        public void Dispose()
-        {
-            Dispose(true);
-            GC.SuppressFinalize(this);
-        }
-
-        protected virtual void Dispose(bool disposing)
+        /// <param name="packet">An audio or video packet to record.</param>
+        /// <remarks>
+        /// The recorder state must be <see cref="RecorderState.Recording"/> state by <see cref="Start"/>.
+        /// </remarks>
+        /// <exception cref="InvalidOperationException">
+        ///     The recorder is not in the valid state.\n
+        ///     -or-\n
+        ///     <paramref name="packet"/> is an audio packet but audio recording is not enabled(See <see cref="StreamRecorderOptions.Audio"/>).\n
+        ///     -or-\n
+        ///     <paramref name="packet"/> is a video packet but video recording is not enabled(See <see cref="StreamRecorderOptions.Video"/>).\n
+        ///     -or-\n
+        ///     <paramref name="packet"/> is a video packet but the <see cref="VideoMediaFormat.MimeType"/> does not match the video source format.\n
+        ///     -or-\n
+        ///     An internal error occurs.
+        /// </exception>
+        /// <exception cref="ObjectDisposedException">The <see cref="StreamRecorder"/> has already been disposed.</exception>
+        /// <see cref="Prepare(StreamRecorderOptions)"/>
+        /// <seealso cref="StreamRecorderOptions.Audio"/>
+        /// <seealso cref="StreamRecorderOptions.Video"/>
+        /// <seealso cref="StreamRecorderVideoOptions.SourceFormat"/>
+        public void PushBuffer(MediaPacket packet)
         {
-            if (!_disposed)
+            if (packet == null)
             {
-                if (disposing)
-                {
-                    // to be used if there are any other disposable objects
-                }
-                if (_handle != IntPtr.Zero)
-                {
-                    Native.Destroy(_handle);
-                    _handle = IntPtr.Zero;
-                }
-                _disposed = true;
+                throw new ArgumentNullException(nameof(packet));
             }
-        }
 
-        private void RegisterStreamRecorderNotifiedEvent()
-        {
-            _notifiedCallback = (StreamRecorderState previous, StreamRecorderState current, StreamRecorderNotify notify, IntPtr userData) =>
-            {
-                StreamRecorderNotifiedEventArgs eventArgs = new StreamRecorderNotifiedEventArgs(previous, current, notify);
-                _recorderNotified?.Invoke(this, eventArgs);
-            };
-            int ret = Native.SetNotifiedCallback(_handle, _notifiedCallback, IntPtr.Zero);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Setting notify callback failed");
-            }
-        }
+            ValidateState(RecorderState.Recording);
 
-        private void UnregisterStreamRecorderNotifiedEvent()
-        {
-            int ret = Native.UnsetNotifiedCallback(_handle);
-            if (ret != (int)StreamRecorderError.None)
+            switch (packet.Format.Type)
             {
-                StreamRecorderErrorFactory.ThrowException(ret, "Unsetting notify callback failed");
-            }
-        }
+                case MediaFormatType.Audio:
+                    if (_audioEnabled == false)
+                    {
+                        throw new InvalidOperationException("Audio option is not set.");
+                    }
+                    break;
 
-        private void RegisterBufferComsumedEvent()
-        {
-            _bufferConsumedCallback = (IntPtr buffer, IntPtr userData) =>
-            {
-                StreamRecordingBufferConsumedEventArgs eventArgs = new StreamRecordingBufferConsumedEventArgs(buffer);
-                _bufferConsumed?.Invoke(this, eventArgs);
-            };
-            int ret = Native.SetBufferConsumedCallback(_handle, _bufferConsumedCallback, IntPtr.Zero);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Setting buffer consumed callback failed");
-            }
-        }
+                case MediaFormatType.Video:
+                    if (_videoEnabled == false)
+                    {
+                        throw new InvalidOperationException("Video option is not set.");
+                    }
 
-        private void UnregisterBufferComsumedEvent()
-        {
-            int ret = Native.UnsetBufferConsumedCallback(_handle);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Unsetting buffer consumed callback failed");
-            }
-        }
+                    if (AreVideoTypesMatched(_sourceFormat, (packet.Format as VideoMediaFormat).MimeType) == false)
+                    {
+                        throw new InvalidOperationException("Video format does not match.");
+                    }
 
-        private void RegisterRecordingStatusChangedEvent()
-        {
-            _recordingStatusCallback = (ulong elapsedTime, ulong fileSize, IntPtr userData) =>
-            {
-                RecordingStatusChangedEventArgs eventArgs = new RecordingStatusChangedEventArgs((long)elapsedTime, (long)fileSize);
-                _recordingStatusChanged?.Invoke(this, eventArgs);
-            };
-            int ret = Native.SetStatusChangedCallback(_handle, _recordingStatusCallback, IntPtr.Zero);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Setting status changed callback failed");
-            }
-        }
+                    break;
 
-        private void UnregisterRecordingStatusChangedEvent()
-        {
-            int ret = Native.UnsetStatusChangedCallback(_handle);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Unsetting status changed callback failed");
+                default:
+                    throw new ArgumentException("Packet is not valid.");
             }
-        }
 
-        private void RegisterRecordingLimitReachedEvent()
-        {
-            _recordingLimitReachedCallback = (StreamRecordingLimitType type, IntPtr userData) =>
-            {
-                StreamRecordingLimitReachedEventArgs eventArgs = new StreamRecordingLimitReachedEventArgs(type);
-                _recordingLimitReached?.Invoke(this, eventArgs);
-            };
-            int ret = Native.SetLimitReachedCallback(_handle, _recordingLimitReachedCallback, IntPtr.Zero);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Setting limit reached callback failed");
-            }
+            Native.PushStreamBuffer(Handle, MediaPacket.Lock.Get(packet).GetHandle())
+                .ThrowIfError("Failed to push buffer.");
         }
 
-        private void UnregisterRecordingLimitReachedEvent()
-        {
-            int ret = Native.UnsetLimitReachedCallback(_handle);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Unsetting limit reached callback failed");
-            }
-        }
+        #endregion
 
-        private void RegisterRecordingErrorOccurredEvent()
+        #region Dispose support
+        /// <summary>
+        /// Release any unmanaged resources used by this object.
+        /// </summary>
+        public void Dispose()
         {
-            _recorderErrorCallback = (StreamRecorderErrorCode error, StreamRecorderState current, IntPtr userData) =>
-            {
-                StreamRecordingErrorOccurredEventArgs eventArgs = new StreamRecordingErrorOccurredEventArgs(error, current);
-                _recordingErrorOccurred?.Invoke(this, eventArgs);
-            };
-            int ret = Native.SetErrorCallback(_handle, _recorderErrorCallback, IntPtr.Zero);
-            if (ret != (int)StreamRecorderError.None)
-            {
-                StreamRecorderErrorFactory.ThrowException(ret, "Setting Error callback failed");
-            }
+            Dispose(true);
         }
 
-        private void UnregisterRecordingErrorOccurredEvent()
+        /// <summary>
+        /// Releases the resources used by the StreamRecorder.
+        /// </summary>
+        /// <param name="disposing">
+        /// true to release both managed and unmanaged resources; false to release only unmanaged resources.
+        /// </param>
+        protected virtual void Dispose(bool disposing)
         {
-            int ret = Native.UnsetErrorCallback(_handle);
-            if (ret != (int)StreamRecorderError.None)
+            if (!_disposed)
             {
-                StreamRecorderErrorFactory.ThrowException(ret, "Unsetting Error callback failed");
+                _handle?.Dispose();
+
+                _disposed = true;
             }
         }
+        #endregion
     }
 }
diff --git a/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderAudioOptions.cs b/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderAudioOptions.cs
new file mode 100644 (file)
index 0000000..911cf34
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using Native = Interop.StreamRecorder;
+
+namespace Tizen.Multimedia
+{
+    /// <summary>
+    /// Specifies the options associated with audio recording.
+    /// </summary>
+    /// <seealso cref="StreamRecorder"/>
+    /// <seealso cref="StreamRecorderOptions"/>
+    /// <seealso cref="StreamRecorderVideoOptions"/>
+    public class StreamRecorderAudioOptions
+    {
+        private const int DefaultSampleRate = 0;
+        private const int DefaultBitRate = 128000;
+        private const int DefaultChannels = 2;
+
+        /// <summary>
+        /// Initialize a new instance of the <see cref="StreamRecorderAudioOptions"/> class with the specified codec.
+        /// </summary>
+        /// <param name="codec">The <see cref="RecorderAudioCodec"/> for encoding audio stream.</param>
+        /// <remarks>
+        /// <see cref="SampleRate"/>, <see cref="BitRate"/> and <see cref="Channels"/> will be set as default.
+        /// </remarks>
+        /// <exception cref="ArgumentException"><paramref name="codec"/> is not valid.</exception>
+        public StreamRecorderAudioOptions(RecorderAudioCodec codec) :
+            this(codec, DefaultSampleRate, DefaultBitRate, DefaultChannels)
+        {
+        }
+
+        /// <summary>
+        /// Initialize a new instance of the <see cref="StreamRecorderAudioOptions"/> class with the specified
+        /// codec, sample rate, bit rate and channel value.
+        /// </summary>
+        /// <param name="codec">The <see cref="RecorderAudioCodec"/> for encoding audio stream.</param>
+        /// <param name="sampleRate">The sample rate for encoding audio stream.</param>
+        /// <param name="bitRate">The bit rate for encoding audio stream.</param>
+        /// <param name="channels">The number of channels for encoding audio stream.</param>
+        /// <exception cref="ArgumentException"><paramref name="codec"/> is not valid.</exception>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     <paramref name="sampleRate"/> is less than zero.\n
+        ///     -or-\n
+        ///     <paramref name="bitRate"/> is less than or equal to zero.\n
+        ///     -or-\n
+        ///     <paramref name="channels"/> is less than or equal to zero.
+        /// </exception>
+        public StreamRecorderAudioOptions(RecorderAudioCodec codec, int sampleRate, int bitRate, int channels)
+        {
+            Codec = codec;
+            SampleRate = sampleRate;
+            BitRate = bitRate;
+            Channels = channels;
+        }
+
+        private RecorderAudioCodec _codec;
+
+        /// <summary>
+        /// Gets or sets the audio codec for encoding an audio stream.
+        /// </summary>
+        /// <value>The codec for audio stream recording.</value>
+        /// <exception cref="ArgumentException"><paramref name="value"/> is not valid.</exception>
+        /// <seealso cref="StreamRecorder.GetSupportedAudioCodecs"/>
+        public RecorderAudioCodec Codec
+        {
+            get => _codec;
+            set
+            {
+                ValidationUtil.ValidateEnum(typeof(RecorderAudioCodec), value, nameof(value));
+
+                _codec = value;
+            }
+        }
+
+        private int _sampleRate;
+
+        /// <summary>
+        /// Gets or sets the sampling rate of the audio stream in hertz.
+        /// </summary>
+        /// <remarks>If the value is zero, the sample rate will be decided based on input buffers.</remarks>
+        /// <value>The sample rate value for stream recorder. The default is zero.</value>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is less than zero.</exception>
+        public int SampleRate
+        {
+            get => _sampleRate;
+            set
+            {
+                if (value < 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Sample rate can't be less than or equal to zero.");
+                }
+
+                _sampleRate = value;
+            }
+        }
+
+        private int _bitRate;
+
+        /// <summary>
+        /// Gets or sets the bit rate of the audio encoder in bits per second.
+        /// </summary>
+        /// <value>The bit rate value for audio stream recording. The default is 128000.</value>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is less than or equal to zero.</exception>
+        public int BitRate
+        {
+            get => _bitRate;
+            set
+            {
+                if (value <= 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Bit rate can't be less than or equal to zero.");
+                }
+
+                _bitRate = value;
+            }
+        }
+
+        private int _channels;
+
+        /// <summary>
+        /// Gets or sets the number of audio channels.
+        /// </summary>
+        /// <value>The number of audio channels for audio stream recording. The default is 2.</value>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is less than or equal to zero.</exception>
+        public int Channels
+        {
+            get => _channels;
+            set
+            {
+                if (value <= 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Channels can't be less than or equal to zero.");
+                }
+
+                _channels = value;
+            }
+        }
+
+        internal void Apply(StreamRecorder recorder)
+        {
+            recorder.ValidateAudioCodec(Codec);
+
+            Native.SetAudioEncoder(recorder.Handle, Codec.ToStreamRecorderEnum()).
+                ThrowIfError("Failed to set audio codec.");
+
+            Native.SetAudioSampleRate(recorder.Handle, SampleRate).
+                ThrowIfError("Failed to set audio sample rate.");
+
+            Native.SetAudioEncoderBitrate(recorder.Handle, BitRate).
+                ThrowIfError("Failed to set audio bit rate.");
+
+            Native.SetAudioChannel(recorder.Handle, Channels).
+                ThrowIfError("Failed to set audio channels.");
+        }
+    }
+
+}
@@ -18,25 +18,20 @@ using System;
 
 namespace Tizen.Multimedia
 {
+
     /// <summary>
-    /// An extended EventArgs.
+    /// Provides data for the <see cref="StreamRecorder.BufferConsumed"/> event.
     /// </summary>
-    public class StreamRecordingBufferConsumedEventArgs : EventArgs
+    public class StreamRecorderBufferConsumedEventArgs : EventArgs
     {
-        private IntPtr _buffer = IntPtr.Zero;
-
-        internal StreamRecordingBufferConsumedEventArgs(IntPtr buffer)
+        internal StreamRecorderBufferConsumedEventArgs(MediaPacket packet)
         {
-            _buffer = buffer;
+            Packet = packet;
         }
 
         /// <summary>
-        /// Consumed buffer.
+        /// Gets the packet that has consumed.
         /// </summary>
-        public IntPtr Buffer {
-            get {
-                return _buffer;
-            }
-        }
+        public MediaPacket Packet { get; }
     }
 }
index 58b6511..041d0f0 100644 (file)
  * limitations under the License.
  */
 
+using System;
+using System.Diagnostics;
+
 namespace Tizen.Multimedia
 {
+
+    /// <summary>
+    /// Specifies errors for <see cref="StreamRecorder"/>/
+    /// </summary>
+    public enum StreamRecorderError
+    {
+        /// <summary>
+        /// Internal error.
+        /// </summary>
+        InternalError = StreamRecorderErrorCode.InvalidOperation,
+        /// <summary>
+        /// Out of storage.
+        /// </summary>
+        OutOfStorage = StreamRecorderErrorCode.OutOfStorage
+    }
+
+    /// <summary>
+    /// Specifies the video source formats for <see cref="StreamRecorder"/>.
+    /// </summary>
+    public enum StreamRecorderVideoFormat
+    {
+        /// <summary>
+        /// Nv12 format.
+        /// </summary>
+        Nv12,
+        /// <summary>
+        /// Nv21 format.
+        /// </summary>
+        Nv21,
+        /// <summary>
+        /// I420 format.
+        /// </summary>
+        I420
+    }
+
+    #region Internal enums
+
     /// <summary>
     /// Enumeration for Audio Codec.
     /// </summary>
-    public enum StreamRecorderAudioCodec
+    internal enum StreamRecorderAudioCodec
     {
         /// <summary>
         /// AMR codec.
@@ -38,7 +78,7 @@ namespace Tizen.Multimedia
     /// <summary>
     /// Enumeration for the file container format.
     /// </summary>
-    public enum StreamRecorderFileFormat
+    internal enum StreamRecorderFileFormat
     {
         /// <summary>
         /// 3GP file format.
@@ -65,64 +105,22 @@ namespace Tizen.Multimedia
     /// <summary>
     /// Enumeration for the recorder notify type.
     /// </summary>
-    public enum StreamRecorderNotify
+    internal enum StreamRecorderNotify
     {
         /// <summary>
         /// None.
         /// </summary>
         None = 0,
         /// <summary>
-        /// State changed noti.
+        /// State changed.
         /// </summary>
         StateChanged
     }
 
     /// <summary>
-    /// Enumeration for the recording limit type.
-    /// </summary>
-    public enum StreamRecordingLimitType
-    {
-        /// <summary>
-        /// Time limit in seconds of recording file
-        /// </summary>
-        Time,
-        /// <summary>
-        /// Size limit in KB(KiloBytes) of recording file.
-        /// </summary>
-        Size
-    }
-
-    /// <summary>
-    /// Enumeration for stream recorder states.
-    /// </summary>
-    public enum StreamRecorderState
-    {
-        /// <summary>
-        /// Stream recorder is not created.
-        /// </summary>
-        None,
-        /// <summary>
-        /// Stream recorder is created, but not prepared.
-        /// </summary>
-        Created,
-        /// <summary>
-        /// Stream recorder is ready to record.
-        /// </summary>
-        Prepared,
-        /// <summary>
-        /// Stream recorder is recording pushed packet.
-        /// </summary>
-        Recording,
-        /// <summary>
-        /// Stream recorder is paused.
-        /// </summary>
-        Paused
-    }
-
-    /// <summary>
     /// Enumeration for video codec.
     /// </summary>
-    public enum StreamRecorderVideoCodec
+    internal enum StreamRecorderVideoCodec
     {
         /// <summary>
         /// H263 codec.
@@ -137,7 +135,7 @@ namespace Tizen.Multimedia
     /// <summary>
     /// Enumeration for source type.
     /// </summary>
-    public enum StreamRecorderSourceType
+    internal enum StreamRecorderSourceType
     {
         /// <summary>
         /// Video source
@@ -153,45 +151,122 @@ namespace Tizen.Multimedia
         VideoAudio
     }
 
-    /// <summary>
-    /// Enumeration for video source format.
-    /// </summary>
-    public enum StreamRecorderVideoSourceFormat
+    internal static class StreamRecorderEnumExtensions
     {
-        /// <summary>
-        /// Nv12 Video source format
-        /// </summary>
-        Nv12,
-        /// <summary>
-        /// Nv21 video source format
-        /// </summary>
-        Nv21,
-        /// <summary>
-        /// I420 video source format
-        /// </summary>
-        I420
-    }
+        internal static RecorderVideoCodec ToRecorderEnum(this StreamRecorderVideoCodec value)
+        {
+            switch (value)
+            {
+                case StreamRecorderVideoCodec.H263:
+                    return RecorderVideoCodec.H263;
 
-    /// <summary>
-    /// Enumeration for stream recorder failure error.
-    /// </summary>
-    public enum StreamRecorderErrorCode
-    {
-        /// <summary>
-        /// Sucessful.
-        /// </summary>
-        None = StreamRecorderError.None,
-        /// <summary>
-        /// Internal error.
-        /// </summary>
-        InvalidParameter = StreamRecorderError.InvalidParameter,
-        /// <summary>
-        /// Internal error.
-        /// </summary>
-        InvalidOperation = StreamRecorderError.InvalidOperation,
-        /// <summary>
-        /// Out of memory.
-        /// </summary>
-        OutOfMemory = StreamRecorderError.OutOfMemory
+                case StreamRecorderVideoCodec.Mpeg4:
+                    return RecorderVideoCodec.Mpeg4;
+            }
+
+            Debug.Fail("Unknown video codec value.");
+            return 0;
+        }
+
+        internal static StreamRecorderVideoCodec ToStreamRecorderEnum(this RecorderVideoCodec value)
+        {
+            switch (value)
+            {
+                case RecorderVideoCodec.H263:
+                    return StreamRecorderVideoCodec.H263;
+
+                case RecorderVideoCodec.Mpeg4:
+                    return StreamRecorderVideoCodec.Mpeg4;
+            }
+
+            throw new NotSupportedException($"{value.ToString()} is not supported.");
+        }
+
+
+        internal static RecorderAudioCodec ToRecorderEnum(this StreamRecorderAudioCodec value)
+        {
+            switch (value)
+            {
+                case StreamRecorderAudioCodec.Aac:
+                    return RecorderAudioCodec.Aac;
+
+                case StreamRecorderAudioCodec.Amr:
+                    return RecorderAudioCodec.Amr;
+
+                case StreamRecorderAudioCodec.Pcm:
+                    return RecorderAudioCodec.Pcm;
+            }
+
+            Debug.Fail("Unknown audio codec value.");
+            return 0;
+        }
+
+
+        internal static StreamRecorderAudioCodec ToStreamRecorderEnum(this RecorderAudioCodec value)
+        {
+            switch (value)
+            {
+                case RecorderAudioCodec.Aac:
+                    return StreamRecorderAudioCodec.Aac;
+
+                case RecorderAudioCodec.Amr:
+                    return StreamRecorderAudioCodec.Amr;
+
+                case RecorderAudioCodec.Pcm:
+                    return StreamRecorderAudioCodec.Pcm;
+            }
+
+            throw new NotSupportedException($"{value.ToString()} is not supported.");
+        }
+
+
+        internal static RecorderFileFormat ToRecorderEnum(this StreamRecorderFileFormat value)
+        {
+            switch (value)
+            {
+                case StreamRecorderFileFormat.ThreeGp:
+                    return RecorderFileFormat.ThreeGp;
+
+                case StreamRecorderFileFormat.Mp4:
+                    return RecorderFileFormat.Mp4;
+
+                case StreamRecorderFileFormat.Amr:
+                    return RecorderFileFormat.Amr;
+
+                case StreamRecorderFileFormat.Adts:
+                    return RecorderFileFormat.Adts;
+
+                case StreamRecorderFileFormat.Wav:
+                    return RecorderFileFormat.Wav;
+            }
+
+            Debug.Fail("Unknown file format value.");
+            return 0;
+        }
+
+
+        internal static StreamRecorderFileFormat ToStreamRecorderEnum(this RecorderFileFormat value)
+        {
+            switch (value)
+            {
+                case RecorderFileFormat.ThreeGp:
+                    return StreamRecorderFileFormat.ThreeGp;
+
+                case RecorderFileFormat.Mp4:
+                    return StreamRecorderFileFormat.Mp4;
+
+                case RecorderFileFormat.Amr:
+                    return StreamRecorderFileFormat.Amr;
+
+                case RecorderFileFormat.Adts:
+                    return StreamRecorderFileFormat.Adts;
+
+                case RecorderFileFormat.Wav:
+                    return StreamRecorderFileFormat.Wav;
+            }
+
+            throw new NotSupportedException($"{value.ToString()} is not supported.");
+        }
     }
+    #endregion
 }
  */
 
 using System;
+using System.IO;
 using Tizen.Internals.Errors;
 
 namespace Tizen.Multimedia
 {
-    internal enum StreamRecorderError
+    internal enum StreamRecorderErrorCode
     {
         None = ErrorCode.None,
         InvalidParameter = ErrorCode.InvalidParameter,
@@ -32,29 +33,40 @@ namespace Tizen.Multimedia
         NotSupported = ErrorCode.NotSupported,
     }
 
-    internal static class StreamRecorderErrorFactory
+    internal static class StreamRecorderErrorExtensions
     {
-        internal static void ThrowException(int errorCode, string errorMessage = null, string paramName = null)
+        internal static StreamRecorderErrorCode Ignore(this StreamRecorderErrorCode errorCode, StreamRecorderErrorCode ignore)
         {
-            StreamRecorderError err = (StreamRecorderError)errorCode;
-            if (string.IsNullOrEmpty(errorMessage))
+            return (ignore == errorCode) ? StreamRecorderErrorCode.None : errorCode;
+        }
+
+        internal static void ThrowIfError(this StreamRecorderErrorCode err, string errorMessage)
+        {
+            if (err == StreamRecorderErrorCode.None)
             {
-                errorMessage = err.ToString();
+                return;
             }
-            switch ((StreamRecorderError)errorCode)
+
+            switch (err)
             {
-                case StreamRecorderError.InvalidParameter:
-                    throw new ArgumentException(errorMessage, paramName);
-                case StreamRecorderError.OutOfMemory:
+                case StreamRecorderErrorCode.InvalidParameter:
+                    throw new ArgumentException(errorMessage);
+
+                case StreamRecorderErrorCode.OutOfMemory:
                     throw new OutOfMemoryException(errorMessage);
-                case StreamRecorderError.PermissionDenied:
+
+                case StreamRecorderErrorCode.PermissionDenied:
                     throw new UnauthorizedAccessException(errorMessage);
-                case StreamRecorderError.NotSupported:
+
+                case StreamRecorderErrorCode.NotSupported:
                     throw new NotSupportedException(errorMessage);
-                case StreamRecorderError.InvalidState:
-                case StreamRecorderError.InvalidOperation:
-                case StreamRecorderError.OutOfStorage:
+
+                case StreamRecorderErrorCode.InvalidState:
+                case StreamRecorderErrorCode.InvalidOperation:
                     throw new InvalidOperationException(errorMessage);
+
+                case StreamRecorderErrorCode.OutOfStorage:
+                    throw new IOException(errorMessage);
             }
         }
     }
@@ -19,24 +19,25 @@ using System;
 namespace Tizen.Multimedia
 {
     /// <summary>
-    /// An extended EventArgs class containing details about the recording limit.
+    /// Provides data for the <see cref="StreamRecorder.ErrorOccurred"/> event.
     /// </summary>
-    public class StreamRecordingLimitReachedEventArgs : EventArgs
+    public class StreamRecorderErrorOccurredEventArgs : EventArgs
     {
-        private StreamRecordingLimitType _type = StreamRecordingLimitType.Size;
-
-        internal StreamRecordingLimitReachedEventArgs(StreamRecordingLimitType type)
+        internal StreamRecorderErrorOccurredEventArgs(StreamRecorderError error, RecorderState state)
         {
-            _type = type;
+            Error = error;
+            State = state;
         }
 
         /// <summary>
-        /// The limitation type.
+        /// Gets the error code.
         /// </summary>
-        public StreamRecordingLimitType Type {
-            get {
-                return _type;
-            }
-        }
+        public StreamRecorderError Error { get; }
+
+        /// <summary>
+        /// Gets the state of the recorder.
+        /// </summary>
+        public RecorderState State { get; }
+
     }
 }
diff --git a/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderNotifiedEventArgs.cs b/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderNotifiedEventArgs.cs
deleted file mode 100644 (file)
index 0ac92f7..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using System.Collections.Generic;
-
-namespace Tizen.Multimedia
-{
-    /// <summary>
-    /// An extended Eventargs class which contains interrupted policy details, previous and current
-    /// state of the recorder.
-    /// </summary>
-    public class StreamRecorderNotifiedEventArgs : EventArgs
-    {
-        private StreamRecorderState _previous = StreamRecorderState.None;
-        private StreamRecorderState _current = StreamRecorderState.None;
-        private StreamRecorderNotify _notify = StreamRecorderNotify.None;
-
-        internal StreamRecorderNotifiedEventArgs(StreamRecorderState previous, StreamRecorderState current, StreamRecorderNotify notify)
-        {
-            _previous = previous;
-            _current = current;
-            _notify = notify;
-        }
-
-        /// <summary>
-        /// The previous state of the stream recorder.
-        /// </summary>
-        public StreamRecorderState Previous {
-            get {
-                return _previous;
-            }
-        }
-
-        /// <summary>
-        /// The current state of the stream recorder.
-        /// </summary>
-        public StreamRecorderState Current {
-            get {
-                return _current;
-            }
-        }
-
-        /// <summary>
-        /// The notify of the event.
-        /// </summary>
-        public StreamRecorderNotify Notify {
-            get {
-                return _notify;
-            }
-        }
-    }
-}
diff --git a/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderOptions.cs b/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderOptions.cs
new file mode 100644 (file)
index 0000000..49d9098
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Diagnostics;
+using Native = Interop.StreamRecorder;
+
+namespace Tizen.Multimedia
+{
+    /// <summary>
+    /// Specifies the options associated with <see cref="StreamRecorder"/>.
+    /// </summary>
+    /// <seealso cref="StreamRecorder"/>
+    /// <seealso cref="StreamRecorder.Prepare(StreamRecorderOptions)"/>
+    /// <seealso cref="StreamRecorderAudioOptions"/>
+    /// <seealso cref="StreamRecorderVideoOptions"/>
+    public class StreamRecorderOptions
+    {
+        /// <summary>
+        /// Initialize a new instance of the <see cref="StreamRecorderOptions"/> class with the specified
+        /// save path and file format.
+        /// </summary>
+        /// <param name="savePath">The path that the recording result is saved.</param>
+        /// <param name="fileFormat">The file format of output file.</param>
+        /// <exception cref="ArgumentNullException"><paramref name="savePath"/>is null.</exception>
+        /// <exception cref="ArgumentException">
+        ///     <paramref name="savePath"/>is an empty string.\n
+        ///     -or-\n
+        ///     <paramref name="fileFormat"/> is not valid.
+        /// </exception>
+        public StreamRecorderOptions(string savePath, RecorderFileFormat fileFormat)
+        {
+            SavePath = savePath;
+            FileFormat = fileFormat;
+        }
+
+        private string _savePath;
+
+        /// <summary>
+        /// Gets or sets the file path to record.
+        /// </summary>
+        /// <remarks>
+        /// If the same file already exists in the file system, then old file will be overwritten.
+        /// </remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/>is null.</exception>
+        /// <exception cref="ArgumentException"><paramref name="value"/>is an empty string.</exception>
+        public string SavePath
+        {
+            get => _savePath;
+            set
+            {
+                if (value == null)
+                {
+                    throw new ArgumentNullException(nameof(value));
+                }
+
+                if (string.IsNullOrWhiteSpace(value))
+                {
+                    throw new ArgumentException("Path can't be an empty string.", nameof(value));
+                }
+
+                _savePath = value;
+            }
+        }
+
+        private RecorderFileFormat _fileFormat;
+
+        /// <summary>
+        /// Gets or sets the file format for recording media stream.
+        /// </summary>
+        /// <exception cref="ArgumentException"><paramref name="value"/> is not valid.</exception>
+        /// <seealso cref="StreamRecorder.GetSupportedFileFormats"/>
+        public RecorderFileFormat FileFormat
+        {
+            get => _fileFormat;
+            set
+            {
+                ValidationUtil.ValidateEnum(typeof(RecorderFileFormat), value, nameof(value));
+
+                _fileFormat = value;
+            }
+        }
+
+        private int _timeLimit;
+
+        /// <summary>
+        /// Gets or sets the time limit of recording.
+        /// </summary>
+        /// <value>
+        /// The maximum time of recording in seconds, or 0 for unlimited time.
+        /// </value>
+        /// <remarks>
+        /// After reaching the limitation, the data which is being recorded will
+        /// be discarded and not written to the file.
+        /// The recorder state must be <see cref="RecorderState.Idle"/> state.
+        /// </remarks>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is less than zero.</exception>
+        /// <seealso cref="StreamRecorder.RecordingLimitReached"/>
+        /// <seealso cref="SizeLimit"/>
+        public int TimeLimit
+        {
+            get => _timeLimit;
+            set
+            {
+                if (value < 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Time limit can't be less than zero.");
+                }
+
+                _timeLimit = value;
+            }
+        }
+
+        private int _sizeLimit;
+
+        /// <summary>
+        /// Gets or sets the maximum size of a recording file.
+        /// </summary>
+        /// <value>
+        /// The maximum size of a recording file in kilobytes, or 0 for unlimited size.
+        /// </value>
+        /// <remarks>
+        /// After reaching the limitation, the data which is being recorded will
+        /// be discarded and not written to the file.
+        /// </remarks>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is less than zero.</exception>
+        /// <seealso cref="StreamRecorder.RecordingLimitReached"/>
+        /// <seealso cref="TimeLimit"/>
+        public int SizeLimit
+        {
+            get => _sizeLimit;
+            set
+            {
+                if (value < 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Size limit can't be less than zero.");
+                }
+
+                _sizeLimit = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the options for audio recording.
+        /// </summary>
+        /// <remarks>
+        /// <see cref="Audio"/> or <see cref="Video"/> must be set for recording.
+        /// </remarks>
+        /// <seealso cref="Video"/>
+        public StreamRecorderAudioOptions Audio { get; set; }
+
+        /// <summary>
+        /// Gets or sets the options for video recording.
+        /// </summary>
+        /// <remarks>
+        /// <see cref="Audio"/> or <see cref="Video"/> must be set for recording.
+        /// </remarks>
+        /// <seealso cref="Audio"/>
+        public StreamRecorderVideoOptions Video { get; set; }
+
+        private StreamRecorderSourceType GetSourceType()
+        {
+            Debug.Assert(Audio != null || Video != null);
+
+            if (Audio != null && Video != null)
+            {
+                return StreamRecorderSourceType.VideoAudio;
+            }
+
+            return Audio != null ? StreamRecorderSourceType.Audio : StreamRecorderSourceType.Video;
+        }
+
+        internal void Apply(StreamRecorder recorder)
+        {
+            if (Audio == null && Video == null)
+            {
+                throw new ArgumentException("Both Audio and Video are not set.");
+            }
+
+            Native.EnableSourceBuffer(recorder.Handle, GetSourceType()).ThrowIfError("Failed to apply options.");
+
+            Native.SetFileName(recorder.Handle, SavePath).ThrowIfError("Failed to set save path.");
+
+            recorder.ValidateFileFormat(FileFormat);
+            Native.SetFileFormat(recorder.Handle, FileFormat.ToStreamRecorderEnum())
+                .ThrowIfError("Failed to set file format.");
+
+            Native.SetRecordingLimit(recorder.Handle, RecordingLimitType.Size, SizeLimit).
+                ThrowIfError("Failed to set size limit.");
+
+            Native.SetRecordingLimit(recorder.Handle, RecordingLimitType.Time, TimeLimit).
+                ThrowIfError("Failed to set time limit.");
+
+            Audio?.Apply(recorder);
+
+            Video?.Apply(recorder);
+        }
+    }
+}
@@ -19,37 +19,24 @@ using System;
 namespace Tizen.Multimedia
 {
     /// <summary>
-    /// An extended EventArgs class which contains details about error status and
-    /// state of the recorder when it failed.
+    /// Provides data for the <see cref="StreamRecorder.StateChanged"/> event.
     /// </summary>
-    public class StreamRecordingErrorOccurredEventArgs : EventArgs
+    public class StreamRecorderStateChangedEventArgs : EventArgs
     {
-        private StreamRecorderErrorCode _error = StreamRecorderErrorCode.InvalidOperation;
-        private StreamRecorderState _state = StreamRecorderState.None;
-
-        internal StreamRecordingErrorOccurredEventArgs(StreamRecorderErrorCode error, StreamRecorderState state)
+        internal StreamRecorderStateChangedEventArgs(RecorderState previous, RecorderState current)
         {
-            _error = error;
-            _state = state;
+            Previous = previous;
+            Current = current;
         }
 
         /// <summary>
-        /// The error code.
+        /// Gets the previous state of the stream recorder.
         /// </summary>
-        public StreamRecorderErrorCode Error {
-            get {
-                return _error;
-            }
-        }
+        public RecorderState Previous { get; }
 
         /// <summary>
-        /// The state of the recorder.
+        /// Gets the current state of the stream recorder.
         /// </summary>
-        public StreamRecorderState State {
-            get {
-                return _state;
-            }
-        }
-
+        public RecorderState Current { get; }
     }
 }
diff --git a/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderVideoOptions.cs b/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderVideoOptions.cs
new file mode 100644 (file)
index 0000000..3460532
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using Native = Interop.StreamRecorder;
+
+namespace Tizen.Multimedia
+{
+    /// <summary>
+    /// Specifies the options associated with video recording.
+    /// </summary>
+    /// <seealso cref="StreamRecorder"/>
+    /// <seealso cref="StreamRecorderOptions"/>
+    /// <seealso cref="StreamRecorderAudioOptions"/>
+    public class StreamRecorderVideoOptions
+    {
+        private const int DefaultBitRate = 0;
+
+        /// <summary>
+        /// Initialize a new instance of the <see cref="StreamRecorderVideoOptions"/> class with the specified
+        /// codec, resolution, source format and frame rate.
+        /// </summary>
+        /// <param name="codec">The <see cref="RecorderVideoCodec"/> for encoding video stream.</param>
+        /// <param name="resolution">The resolution of video recording.</param>
+        /// <param name="sourceFormat">The format of source stream.</param>
+        /// <param name="frameRate">The frame rate for encoding video stream.</param>
+        /// <remarks>
+        /// <see cref="BitRate"/> will be set as default.
+        /// </remarks>
+        /// <exception cref="ArgumentException">
+        ///     <paramref name="codec"/> is not valid.\n
+        ///     -or-\n
+        ///     <paramref name="sourceFormat"/> is not valid.\n
+        /// </exception>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     Width or height of <paramref name="resolution"/> is less than or equal to zero.\n
+        ///     -or-\n
+        ///     <paramref name="frameRate"/> is less than or equal to zero.\n
+        /// </exception>
+        public StreamRecorderVideoOptions(RecorderVideoCodec codec, Size resolution,
+            StreamRecorderVideoFormat sourceFormat, int frameRate) :
+            this(codec, resolution, sourceFormat, frameRate, DefaultBitRate)
+        {
+        }
+
+        /// <summary>
+        /// Initialize a new instance of the <see cref="StreamRecorderVideoOptions"/> class with the specified
+        /// codec, resolution, source format, frame rate and bit rate.
+        /// </summary>
+        /// <param name="codec">The <see cref="RecorderVideoCodec"/> for encoding video stream.</param>
+        /// <param name="resolution">The resolution of video recording.</param>
+        /// <param name="sourceFormat">The format of source stream.</param>
+        /// <param name="frameRate">The frame rate for encoding video stream.</param>
+        /// <param name="bitRate">The bit rate for encoding video stream.</param>
+        /// <exception cref="ArgumentException">
+        ///     <paramref name="codec"/> is not valid.\n
+        ///     -or-\n
+        ///     <paramref name="sourceFormat"/> is not valid.\n
+        /// </exception>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     Width or height of <paramref name="resolution"/> is less than or equal to zero.\n
+        ///     -or-\n
+        ///     <paramref name="frameRate"/> is less than or equal to zero.\n
+        ///     -or-\n
+        ///     <paramref name="bitRate"/> is less than zero.
+        /// </exception>
+        public StreamRecorderVideoOptions(RecorderVideoCodec codec, Size resolution,
+            StreamRecorderVideoFormat sourceFormat, int frameRate, int bitRate)
+        {
+            Codec = codec;
+            Resolution = resolution;
+            SourceFormat = sourceFormat;
+            FrameRate = frameRate;
+            BitRate = bitRate;
+        }
+
+        private RecorderVideoCodec _codec;
+
+        /// <summary>
+        /// Gets or sets the video codec for encoding video stream.
+        /// </summary>
+        /// <value>The codec for video stream recording.</value>
+        /// <exception cref="ArgumentException"><paramref name="value"/> is not valid.</exception>
+        /// <seealso cref="StreamRecorder.GetSupportedVideoCodecs"/>
+        public RecorderVideoCodec Codec
+        {
+            get => _codec;
+            set
+            {
+                ValidationUtil.ValidateEnum(typeof(RecorderVideoCodec), value, nameof(value));
+
+                _codec = value;
+            }
+        }
+
+        private Size _resolution;
+
+        /// <summary>
+        /// Gets or sets the resolution of the video recording.
+        /// </summary>
+        /// <value>The output resolution for video stream recording.</value>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     Width or height of <paramref name="value"/> is less than or equal to zero.
+        /// </exception>
+        /// <seealso cref="StreamRecorder.GetSupportedVideoResolutions"/>
+        public Size Resolution
+        {
+            get => _resolution;
+            set
+            {
+                if (value.Width <= 0 || value.Height <= 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Resolution can't be less than or equal to zero.");
+                }
+
+                _resolution = value;
+            }
+        }
+
+        private int _frameRate;
+
+        /// <summary>
+        /// Gets or sets the frame rate for recording media stream.
+        /// </summary>
+        /// <value>The frame rate value for video stream recording.</value>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is less than or equal to zero.</exception>
+        public int FrameRate
+        {
+            get => _frameRate;
+            set
+            {
+                if (value <= 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Frame rate can't be less than or equal to zero.");
+                }
+                _frameRate = value;
+            }
+        }
+
+        private StreamRecorderVideoFormat _sourceFormat;
+
+        /// <summary>
+        /// Gets or sets the video source format for recording media stream.
+        /// </summary>
+        /// <value>The source format of buffers for video stream recording.</value>
+        /// <exception cref="ArgumentException"><paramref name="value"/> is not valid.</exception>
+        public StreamRecorderVideoFormat SourceFormat
+        {
+            get => _sourceFormat;
+            set
+            {
+                ValidationUtil.ValidateEnum(typeof(StreamRecorderVideoFormat), value, nameof(value));
+
+                _sourceFormat = value;
+            }
+        }
+
+        private int _bitRate;
+
+        /// <summary>
+        /// The bit rate of the video encoder in bits per second.
+        /// </summary>
+        /// <value>The bit rate value for video stream recording. The default is 0.</value>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is less than zero.</exception>
+        public int BitRate
+        {
+            get => _bitRate;
+            set
+            {
+                if (value < 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), value,
+                        "Bit rate can't be less than or equal to zero.");
+                }
+                _bitRate = value;
+            }
+        }
+
+        internal void Apply(StreamRecorder recorder)
+        {
+            recorder.ValidateVideoCodec(Codec);
+
+            Native.SetVideoEncoder(recorder.Handle, Codec.ToStreamRecorderEnum()).
+                ThrowIfError("Failed to set video codec.");
+
+            recorder.ValidateVideoResolution(Resolution);
+
+            Native.SetVideoResolution(recorder.Handle, Resolution.Width, Resolution.Height).
+                ThrowIfError("Failed to set video resolution.");
+
+            Native.SetVideoFrameRate(recorder.Handle, FrameRate).
+                ThrowIfError("Failed to set video frame rate.");
+
+            Native.SetVideoEncoderBitRate(recorder.Handle, BitRate).
+                ThrowIfError("Failed to set video bit rate.");
+
+            Native.SetVideoSourceFormat(recorder.Handle, SourceFormat).
+                ThrowIfError("Failed to set video source format.");
+        }
+    }
+
+}
diff --git a/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderVideoResolution.cs b/src/Tizen.Multimedia.StreamRecorder/StreamRecorder/StreamRecorderVideoResolution.cs
deleted file mode 100644 (file)
index 8523098..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using Native = Interop.StreamRecorder;
-
-namespace Tizen.Multimedia
-{
-    /// <summary>
-    /// Resolution for stream recorder.
-    /// </summary>
-    public class StreamRecorderVideoResolution
-    {
-        private int _width, _height;
-        private bool _interopFlag;
-        internal IntPtr _Handle;
-
-        internal StreamRecorderVideoResolution(IntPtr handle)
-        {
-            _Handle = handle;
-            _interopFlag = true;
-            int ret = Native.GetVideoResolution(_Handle, out _width, out _height);
-            StreamRecorderError err = (StreamRecorderError)ret;
-            Log.Info(StreamRecorderLog.Tag, "width " + _width + " height " + _height + "return " + err.ToString());
-        }
-
-        internal StreamRecorderVideoResolution(int width, int height)
-        {
-            _interopFlag = false;
-            _width = width;
-            _height = height;
-        }
-
-        /// <summary>
-        /// The video width.
-        /// </summary>
-        /// <value>The width.</value>
-        public int Width {
-            get {
-                if(_interopFlag == true)
-                    Native.GetVideoResolution(_Handle, out _width, out _height);
-                return _width;
-            }
-            set {
-                _width = value;
-                if(_interopFlag == true) {
-                    int ret = Native.SetVideoResolution(_Handle, _width, _height);
-                    StreamRecorderError err = (StreamRecorderError)ret;
-                    Log.Info(StreamRecorderLog.Tag, " set width " + _width + " height " + _height + "set return " + err.ToString());
-                }
-            }
-        }
-
-        /// <summary>
-        /// The video height.
-        /// </summary>
-        /// <value>The height.</value>
-        public int Height {
-            get {
-                if(_interopFlag == true)
-                    Native.GetVideoResolution(_Handle, out _width, out _height);
-                return _height;
-            }
-            set {
-                _height = value;
-                if(_interopFlag == true) {
-                    int ret = Native.SetVideoResolution(_Handle, _width, _height);
-                    StreamRecorderError err = (StreamRecorderError)ret;
-                    Log.Info(StreamRecorderLog.Tag, " set width " + _width + " height " + _height + "set return " + err.ToString());
-                }
-            }
-        }
-    }
-}
diff --git a/src/Tizen.NUI/src/internal/AppSignalType.cs b/src/Tizen.NUI/src/internal/AppSignalType.cs
new file mode 100755 (executable)
index 0000000..2ff2a0a
--- /dev/null
@@ -0,0 +1,141 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+namespace Tizen.NUI
+{
+
+    internal class AppSignalType : global::System.IDisposable
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+        protected bool swigCMemOwn;
+
+        internal AppSignalType(global::System.IntPtr cPtr, bool cMemoryOwn)
+        {
+            swigCMemOwn = cMemoryOwn;
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(AppSignalType obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        //A Flag to check who called Dispose(). (By User or DisposeQueue)
+        private bool isDisposeQueued = false;
+        //A Flat to check if it is already disposed.
+        protected bool disposed = false;
+
+        ~AppSignalType()
+        {
+            if (!isDisposeQueued)
+            {
+                isDisposeQueued = true;
+                DisposeQueue.Instance.Add(this);
+            }
+        }
+
+        public void Dispose()
+        {
+            //Throw excpetion if Dispose() is called in separate thread.
+            if (!Window.IsInstalled())
+            {
+                throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
+            }
+
+            if (isDisposeQueued)
+            {
+                Dispose(DisposeTypes.Implicit);
+            }
+            else
+            {
+                Dispose(DisposeTypes.Explicit);
+                System.GC.SuppressFinalize(this);
+            }
+        }
+
+        protected virtual void Dispose(DisposeTypes type)
+        {
+            if (disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                swigCMemOwn = false;
+                NDalicManualPINVOKE.delete_AppSignalType(swigCPtr);
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            disposed = true;
+        }
+
+        public bool Empty()
+        {
+            bool ret = NDalicManualPINVOKE.AppSignalType_Empty(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public uint GetConnectionCount()
+        {
+            uint ret = NDalicManualPINVOKE.AppSignalType_GetConnectionCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public void Connect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.AppSignalType_Connect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Disconnect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.AppSignalType_Disconnect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Emit(WidgetApplication arg)
+        {
+            NDalicManualPINVOKE.AppSignalType_Emit(swigCPtr, WidgetApplication.getCPtr(arg));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        public AppSignalType() : this(NDalicManualPINVOKE.new_AppSignalType(), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+    }
+}
index 91b60e4..ac6d54d 100755 (executable)
@@ -334,6 +334,61 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_applicationInitEventCallbackDelegate != null)
+            {
+                this.InitSignal().Disconnect(_applicationInitEventCallbackDelegate);
+            }
+
+            if (_applicationTerminateEventCallbackDelegate != null)
+            {
+                this.TerminateSignal().Disconnect(_applicationTerminateEventCallbackDelegate);
+            }
+
+            if (_applicationPauseEventCallbackDelegate != null)
+            {
+                this.PauseSignal().Disconnect(_applicationPauseEventCallbackDelegate);
+            }
+
+            if (_applicationResumeEventCallbackDelegate != null)
+            {
+                this.ResumeSignal().Disconnect(_applicationResumeEventCallbackDelegate);
+            }
+
+            if (_applicationResetEventCallbackDelegate != null)
+            {
+                this.ResetSignal().Disconnect(_applicationResetEventCallbackDelegate);
+            }
+
+            if (_applicationResizeEventCallbackDelegate != null)
+            {
+                this.ResizeSignal().Disconnect(_applicationResizeEventCallbackDelegate);
+            }
+
+            if (_applicationLanguageChangedEventCallbackDelegate != null)
+            {
+                this.LanguageChangedSignal().Disconnect(_applicationLanguageChangedEventCallbackDelegate);
+            }
+
+            if (_applicationRegionChangedEventCallbackDelegate != null)
+            {
+                this.RegionChangedSignal().Disconnect(_applicationRegionChangedEventCallbackDelegate);
+            }
+
+            if (_applicationBatteryLowEventCallbackDelegate != null)
+            {
+                this.BatteryLowSignal().Disconnect(_applicationBatteryLowEventCallbackDelegate);
+            }
+
+            if (_applicationMemoryLowEventCallbackDelegate != null)
+            {
+                this.MemoryLowSignal().Disconnect(_applicationMemoryLowEventCallbackDelegate);
+            }
+
+            if (_applicationAppControlEventCallbackDelegate != null)
+            {
+                this.AppControlSignal().Disconnect(_applicationAppControlEventCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
@@ -1079,8 +1134,27 @@ namespace Tizen.NUI
             return ret;
         }
 
-        //Removed from v0.2.33
-        /*public bool AddIdle(System.Delegate func)
+
+        public static Application NewApplication(string[] args, string stylesheet, Application.WindowMode windowMode)
+        {
+            NUILog.Debug(" NewApplication(string[] args, string stylesheet, Application.WindowMode windowMode) is called! ");
+
+            Application ret = New(args, stylesheet, (Application.WindowMode)windowMode);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+
+            // we've got an application now connect the signals
+            ret.SetupDelegates();
+            // set the singleton
+            _instance = ret;
+            return _instance;
+        }
+
+        /// <summary>
+        /// Ensures that the function passed in is called from the main loop when it is idle.
+        /// </summary>
+        /// <param name="func">The function to call</param>
+        /// <returns>true if added successfully, false otherwise</returns>
+        public bool AddIdle(System.Delegate func)
         {
             System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
             System.IntPtr ip2 = NDalicManualPINVOKE.MakeCallback(new System.Runtime.InteropServices.HandleRef(this, ip));
@@ -1089,9 +1163,7 @@ namespace Tizen.NUI
 
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
             return ret;
-        }*/
-
-
+        }
 
         /**
         * Outer::outer_method(int)
@@ -1132,6 +1204,17 @@ namespace Tizen.NUI
             return ret;
         }
 
+        public static Application New(string[] args, string stylesheet, Application.WindowMode windowMode)
+        {
+            NUILog.Debug("New(string[] args) is called!");
+            int argc = args.Length;
+            string argvStr = string.Join(" ", args);
+
+            Application ret = new Application(NDalicPINVOKE.Application_New__MANUAL_4(argc, argvStr, stylesheet, (int)windowMode), true);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
         public static Application New(int argc, string stylesheet, Application.WindowMode windowMode, Rectangle positionSize)
         {
             Application ret = new Application(NDalicPINVOKE.Application_New__SWIG_4(argc, stylesheet, (int)windowMode, Rectangle.getCPtr(positionSize)), true);
index 585ec28..6ba2744 100755 (executable)
@@ -21,7 +21,7 @@
 
 using System.Runtime.CompilerServices;
 [assembly: InternalsVisibleTo("Tizen.NUI.Extension.Test, PublicKey=00240000048000009400000006020000002400005253413100040000010001004d7c7c03a196ecb8e7cc5056750e1f40ee2bbe99f0e53a07f2538f2b0f450bd731b9dca3706503a0378baca74a09cf3af6261b330c031f44817ab6ed64189460765a402279d3e0c1fa7295ae1dccb2e3ff329705fd85b58d66ae7cb7e95ba06e0d847c3e3ba918798f579e5caeb1c6149955e6baf24236eec46227a623e494b1")]
-[assembly: InternalsVisibleTo("Tizen.Multimedia, PublicKey=0024000004800000940000000602000000240000525341310004000001000100d115b1004248416b12d21b626cfb17149c9303fe394693fd3b32d7872e89559a4fa96c98110c2e62eea48aca693bddbe17094ca8ea2e2cd79970ca590fb672b9b371b5d7002076817321f62d6483ea50c56dbd1f37b185a4c24c47718876e6ae6d266508c551170d4cbdda3f82edaff9405ee3d7857282d8269e8e518d2f0fb2")]
+[assembly: InternalsVisibleTo("Tizen.Multimedia, PublicKey=0024000004800000940000000602000000240000525341310004000001000100bd36a93b6d224759632d08a501b9dcb99a533e8ff0c3a1fc7044f5b05e176c005e5a7fc4d1dfa54da4d4cad4868c4518aa1f661380fb90685dc699d5e48dcc697b33c1e38b70845f405612d6827e7337c191ddd0a0aa35fdad654efe4c54881fdaa82ce35dce18ea918953e448c7aa284a47ed6fe3aa9404930b2b973a28cddf")]
 [assembly: InternalsVisibleTo("Tizen.TV.NUI, PublicKey=0024000004800000940000000602000000240000525341310004000001000100ed445c2a988d35b99e5766f42eef33d89d1f67225db051f011abcfce47a4788875c39750a2e5695f1ec117f41d96610419811762669f98131db30a6e64c6bb8fde3731f373f6cda4c0087d121f5108559f216dc015807dc46ec5a4d1b63f5deff64c01754a0db0dc849bc300672572cbd2697432ab6c193ebf9fade6bf0f2aad")]
 
 namespace Tizen.NUI
index ba61c57..e6870e6 100755 (executable)
@@ -795,6 +795,12 @@ namespace Tizen.NUI
         [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Window_GetPosition")]
         public static extern global::System.IntPtr GetPosition(global::System.Runtime.InteropServices.HandleRef jarg1);
 
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Adaptor_FeedKeyEvent")]
+        public static extern void Window_FeedKeyEvent(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint = "CSharp_Dali_MakeCallback")]
+        public static extern global::System.IntPtr MakeCallback(global::System.Runtime.InteropServices.HandleRef jarg1);
+
         //for widget view
         [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetView_Property_WIDGET_ID_get")]
         public static extern int WidgetView_Property_WIDGET_ID_get();
@@ -926,6 +932,7 @@ namespace Tizen.NUI
         [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetViewManager_SWIGUpcast")]
         public static extern global::System.IntPtr WidgetViewManager_SWIGUpcast(global::System.IntPtr jarg1);
 
+
         //For Adaptor
         [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Adaptor_New__SWIG_0")]
         public static extern global::System.IntPtr Adaptor_New__SWIG_0(global::System.Runtime.InteropServices.HandleRef jarg1);
@@ -1039,5 +1046,254 @@ namespace Tizen.NUI
         [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_AdaptorSignalType")]
         public static extern void delete_AdaptorSignalType(global::System.Runtime.InteropServices.HandleRef jarg1);
 
+        //For widget
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_New")]
+        public static extern global::System.IntPtr Widget_New(string jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_Widget__SWIG_0")]
+        public static extern global::System.IntPtr new_Widget__SWIG_0();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_Widget__SWIG_1")]
+        public static extern global::System.IntPtr new_Widget__SWIG_1(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_Assign")]
+        public static extern global::System.IntPtr Widget_Assign(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_Widget")]
+        public static extern void delete_Widget(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_CreateSignal")]
+        public static extern global::System.IntPtr Widget_CreateSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_TerminateSignal")]
+        public static extern global::System.IntPtr Widget_TerminateSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_PauseSignal")]
+        public static extern global::System.IntPtr Widget_PauseSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_ResumeSignal")]
+        public static extern global::System.IntPtr Widget_ResumeSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_ResizeSignal")]
+        public static extern global::System.IntPtr Widget_ResizeSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_UpdateSignal")]
+        public static extern global::System.IntPtr Widget_UpdateSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_New")]
+        public static extern global::System.IntPtr WidgetApplication_New(int jarg1, string jarg2, string jarg3);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetApplication__SWIG_0")]
+        public static extern global::System.IntPtr new_WidgetApplication__SWIG_0();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetApplication__SWIG_1")]
+        public static extern global::System.IntPtr new_WidgetApplication__SWIG_1(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_Assign")]
+        public static extern global::System.IntPtr WidgetApplication_Assign(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_WidgetApplication")]
+        public static extern void delete_WidgetApplication(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_MainLoop")]
+        public static extern void WidgetApplication_MainLoop(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_Quit")]
+        public static extern void WidgetApplication_Quit(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_GetWindow")]
+        public static extern global::System.IntPtr WidgetApplication_GetWindow(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_GetResourcePath")]
+        public static extern string WidgetApplication_GetResourcePath();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_InitSignal")]
+        public static extern global::System.IntPtr WidgetApplication_InitSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_TerminateSignal")]
+        public static extern global::System.IntPtr WidgetApplication_TerminateSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_LanguageChangedSignal")]
+        public static extern global::System.IntPtr WidgetApplication_LanguageChangedSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_RegionChangedSignal")]
+        public static extern global::System.IntPtr WidgetApplication_RegionChangedSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_BatteryLowSignal")]
+        public static extern global::System.IntPtr WidgetApplication_BatteryLowSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_MemoryLowSignal")]
+        public static extern global::System.IntPtr WidgetApplication_MemoryLowSignal(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_New")]
+        public static extern global::System.IntPtr WidgetData_New(string jarg1, global::System.Runtime.InteropServices.HandleRef jarg2, string jarg3);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetData__SWIG_0")]
+        public static extern global::System.IntPtr new_WidgetData__SWIG_0();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetData__SWIG_1")]
+        public static extern global::System.IntPtr new_WidgetData__SWIG_1(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_Assign")]
+        public static extern global::System.IntPtr WidgetData_Assign(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_WidgetData")]
+        public static extern void delete_WidgetData(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_GetInstanceId")]
+        public static extern string WidgetData_GetInstanceId(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_GetArgs")]
+        public static extern global::System.IntPtr WidgetData_GetArgs(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_GetContent")]
+        public static extern string WidgetData_GetContent(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_GetWindow")]
+        public static extern global::System.IntPtr WidgetData_GetWindow(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_SetArgs")]
+        public static extern void WidgetData_SetArgs(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_SetContent")]
+        public static extern void WidgetData_SetContent(global::System.Runtime.InteropServices.HandleRef jarg1, string jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_SetWindow")]
+        public static extern void WidgetData_SetWindow(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceCreateSignalType_Empty")]
+        public static extern bool WidgetInstanceCreateSignalType_Empty(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceCreateSignalType_GetConnectionCount")]
+        public static extern uint WidgetInstanceCreateSignalType_GetConnectionCount(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceCreateSignalType_Connect")]
+        public static extern void WidgetInstanceCreateSignalType_Connect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceCreateSignalType_Disconnect")]
+        public static extern void WidgetInstanceCreateSignalType_Disconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceCreateSignalType_Emit")]
+        public static extern void WidgetInstanceCreateSignalType_Emit(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2, global::System.Runtime.InteropServices.HandleRef jarg3, global::System.Runtime.InteropServices.HandleRef jarg4);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetInstanceCreateSignalType")]
+        public static extern global::System.IntPtr new_WidgetInstanceCreateSignalType();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_WidgetInstanceCreateSignalType")]
+        public static extern void delete_WidgetInstanceCreateSignalType(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceTerminateSignalType_Empty")]
+        public static extern bool WidgetInstanceTerminateSignalType_Empty(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceTerminateSignalType_GetConnectionCount")]
+        public static extern uint WidgetInstanceTerminateSignalType_GetConnectionCount(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceTerminateSignalType_Connect")]
+        public static extern void WidgetInstanceTerminateSignalType_Connect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceTerminateSignalType_Disconnect")]
+        public static extern void WidgetInstanceTerminateSignalType_Disconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceTerminateSignalType_Emit")]
+        public static extern void WidgetInstanceTerminateSignalType_Emit(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2, global::System.Runtime.InteropServices.HandleRef jarg3, int jarg4);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetInstanceTerminateSignalType")]
+        public static extern global::System.IntPtr new_WidgetInstanceTerminateSignalType();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_WidgetInstanceTerminateSignalType")]
+        public static extern void delete_WidgetInstanceTerminateSignalType(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstancePauseOrResumeSignalType_Empty")]
+        public static extern bool WidgetInstancePauseOrResumeSignalType_Empty(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstancePauseOrResumeSignalType_GetConnectionCount")]
+        public static extern uint WidgetInstancePauseOrResumeSignalType_GetConnectionCount(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstancePauseOrResumeSignalType_Connect")]
+        public static extern void WidgetInstancePauseOrResumeSignalType_Connect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstancePauseOrResumeSignalType_Disconnect")]
+        public static extern void WidgetInstancePauseOrResumeSignalType_Disconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstancePauseOrResumeSignalType_Emit")]
+        public static extern void WidgetInstancePauseOrResumeSignalType_Emit(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetInstancePauseOrResumeSignalType")]
+        public static extern global::System.IntPtr new_WidgetInstancePauseOrResumeSignalType();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_WidgetInstancePauseOrResumeSignalType")]
+        public static extern void delete_WidgetInstancePauseOrResumeSignalType(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceResizeSignalType_Empty")]
+        public static extern bool WidgetInstanceResizeSignalType_Empty(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceResizeSignalType_GetConnectionCount")]
+        public static extern uint WidgetInstanceResizeSignalType_GetConnectionCount(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceResizeSignalType_Connect")]
+        public static extern void WidgetInstanceResizeSignalType_Connect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceResizeSignalType_Disconnect")]
+        public static extern void WidgetInstanceResizeSignalType_Disconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceResizeSignalType_Emit")]
+        public static extern void WidgetInstanceResizeSignalType_Emit(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2, global::System.Runtime.InteropServices.HandleRef jarg3);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetInstanceResizeSignalType")]
+        public static extern global::System.IntPtr new_WidgetInstanceResizeSignalType();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_WidgetInstanceResizeSignalType")]
+        public static extern void delete_WidgetInstanceResizeSignalType(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceUpdateSignalType_Empty")]
+        public static extern bool WidgetInstanceUpdateSignalType_Empty(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceUpdateSignalType_GetConnectionCount")]
+        public static extern uint WidgetInstanceUpdateSignalType_GetConnectionCount(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceUpdateSignalType_Connect")]
+        public static extern void WidgetInstanceUpdateSignalType_Connect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceUpdateSignalType_Disconnect")]
+        public static extern void WidgetInstanceUpdateSignalType_Disconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetInstanceUpdateSignalType_Emit")]
+        public static extern void WidgetInstanceUpdateSignalType_Emit(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2, global::System.Runtime.InteropServices.HandleRef jarg3, int jarg4);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_WidgetInstanceUpdateSignalType")]
+        public static extern global::System.IntPtr new_WidgetInstanceUpdateSignalType();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_WidgetInstanceUpdateSignalType")]
+        public static extern void delete_WidgetInstanceUpdateSignalType(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_AppSignalType_Empty")]
+        public static extern bool AppSignalType_Empty(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_AppSignalType_GetConnectionCount")]
+        public static extern uint AppSignalType_GetConnectionCount(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_AppSignalType_Connect")]
+        public static extern void AppSignalType_Connect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_AppSignalType_Disconnect")]
+        public static extern void AppSignalType_Disconnect(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_AppSignalType_Emit")]
+        public static extern void AppSignalType_Emit(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_AppSignalType")]
+        public static extern global::System.IntPtr new_AppSignalType();
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_delete_AppSignalType")]
+        public static extern void delete_AppSignalType(global::System.Runtime.InteropServices.HandleRef jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Widget_SWIGUpcast")]
+        public static extern global::System.IntPtr Widget_SWIGUpcast(global::System.IntPtr jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetApplication_SWIGUpcast")]
+        public static extern global::System.IntPtr WidgetApplication_SWIGUpcast(global::System.IntPtr jarg1);
+
+        [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_WidgetData_SWIGUpcast")]
+        public static extern global::System.IntPtr WidgetData_SWIGUpcast(global::System.IntPtr jarg1);
     }
 }
index 1939974..e6c72b6 100755 (executable)
@@ -6296,6 +6296,9 @@ class NDalicPINVOKE {
   [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Application_New__SWIG_3")]
   public static extern global::System.IntPtr Application_New__SWIG_3(int jarg1, string jarg3, int jarg4);
 
+  [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_Application_New__MANUAL_4")]
+  public static extern global::System.IntPtr Application_New__MANUAL_4(int jarg1, string jarg2, string jarg3, int jarg4);
+
   [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_new_Application__SWIG_0")]
   public static extern global::System.IntPtr new_Application__SWIG_0();
 
@@ -6428,7 +6431,6 @@ class NDalicPINVOKE {
   [global::System.Runtime.InteropServices.DllImport("NDalic", EntryPoint="CSharp_Dali_Application_New__SWIG_4")]
   public static extern global::System.IntPtr Application_New__SWIG_4(int jarg1, string jarg3, int jarg4, global::System.Runtime.InteropServices.HandleRef jarg5);
 
-
   [global::System.Runtime.InteropServices.DllImport("libdali-csharp-binder.so", EntryPoint="CSharp_Dali_TimerSignalType_Empty")]
   public static extern bool TimerSignalType_Empty(global::System.Runtime.InteropServices.HandleRef jarg1);
 
index 05744b8..3f28755 100755 (executable)
@@ -30,6 +30,8 @@ namespace Tizen.NUI
         /// Application instance to connect event.
         /// </summary>
         protected Application _application;
+        private string _stylesheet = "";
+        private NUIApplication.WindowMode _windowMode = NUIApplication.WindowMode.Opaque;
 
         /// <summary>
         /// Dictionary to contain each type of event callback.
@@ -41,7 +43,6 @@ namespace Tizen.NUI
         /// </summary>
         public NUICoreBackend()
         {
-            _application = Application.NewApplication();
         }
 
         /// <summary>
@@ -49,7 +50,7 @@ namespace Tizen.NUI
         /// </summary>
         public NUICoreBackend(string stylesheet)
         {
-            _application = Application.NewApplication(stylesheet);
+            _stylesheet = stylesheet;
         }
 
         /// <summary>
@@ -57,7 +58,8 @@ namespace Tizen.NUI
         /// </summary>
         public NUICoreBackend(string stylesheet, NUIApplication.WindowMode windowMode)
         {
-            _application = Application.NewApplication(stylesheet, (Application.WindowMode)windowMode );
+            _stylesheet = stylesheet;
+            _windowMode = windowMode;
         }
 
         /// <summary>
@@ -89,7 +91,10 @@ namespace Tizen.NUI
         /// </summary>
         public void Dispose()
         {
-            _application.Dispose();
+            if(_application != null)
+            {
+                _application.Dispose();
+            }
         }
 
         /// <summary>
@@ -97,7 +102,20 @@ namespace Tizen.NUI
         /// </summary>
         public void Exit()
         {
-            _application.Quit();
+            if(_application != null)
+            {
+                _application.Quit();
+            }
+        }
+
+        /// <summary>
+        /// Ensures that the function passed in is called from the main loop when it is idle.
+        /// </summary>
+        /// <param name="func">The function to call</param>
+        /// <returns>true if added successfully, false otherwise</returns>
+        public bool AddIdle(System.Delegate func)
+        {
+            return _application.AddIdle(func);
         }
 
         /// <summary>
@@ -107,6 +125,17 @@ namespace Tizen.NUI
         public void Run(string[] args)
         {
             TizenSynchronizationContext.Initialize();
+
+            args[0] = Tizen.Applications.Application.Current.ApplicationInfo.ExecutablePath;
+            if (args.Length == 1)
+            {
+                _application = Application.NewApplication();
+            }
+            else if (args.Length > 1)
+            {
+                _application = Application.NewApplication(args, _stylesheet, (Application.WindowMode)_windowMode);
+            }
+
             _application.BatteryLow += OnBatteryLow;
             _application.LanguageChanged += OnLanguageChanged;
             _application.MemoryLow += OnMemoryLow;
@@ -221,10 +250,9 @@ namespace Tizen.NUI
         private void OnAppControl(object source, NUIApplicationAppControlEventArgs e)
         {
             Log.Debug("NUI", "NUICorebackend OnAppControl Called");
-            /* can invoke after making new api which getting control handle at application.
             var handler = Handlers[EventType.AppControlReceived] as Action<AppControlReceivedEventArgs>;
-            handler?.Invoke();
-            */
+            SafeAppControlHandle handle = new SafeAppControlHandle(e.VoidP,false);
+            handler?.Invoke( new AppControlReceivedEventArgs(new ReceivedAppControl(handle)) );
         }
 
         /// <summary>
diff --git a/src/Tizen.NUI/src/internal/NUIWidgetCoreBackend.cs b/src/Tizen.NUI/src/internal/NUIWidgetCoreBackend.cs
new file mode 100755 (executable)
index 0000000..ec05e43
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+
+using Tizen.Applications.CoreBackend;
+using Tizen.Applications;
+
+namespace Tizen.NUI
+{
+    class NUIWidgetCoreBackend : ICoreBackend
+    {
+        /// <summary>
+        /// Application instance to connect event.
+        /// </summary>
+        protected WidgetApplication _application;
+        private string _stylesheet = "";
+
+        /// <summary>
+        /// Dictionary to contain each type of event callback.
+        /// </summary>
+        protected IDictionary<EventType, object> Handlers = new Dictionary<EventType, object>();
+
+        /// <summary>
+        /// The default Constructor.
+        /// </summary>
+        public NUIWidgetCoreBackend()
+        {
+            //Tizen.Log.Fatal("NUI", "### NUIWidgetCoreBackend called");
+            //_application = WidgetApplication.NewWidgetApplication();
+        }
+
+        /// <summary>
+        /// The constructor with stylesheet.
+        /// </summary>
+        public NUIWidgetCoreBackend(string stylesheet)
+        {
+            _stylesheet = stylesheet;
+            //_application = WidgetApplication.NewWidgetApplication(stylesheet);
+        }
+
+        /// <summary>
+        /// Add NUIWidgetApplication event to Application.
+        /// Put each type of event callback in Dictionary.
+        /// </summary>
+        /// <param name="evType">Type of event</param>
+        /// <param name="handler">Event callback</param>
+        public void AddEventHandler(EventType evType, Action handler)
+        {
+            Handlers.Add(evType, handler);
+        }
+
+        /// <summary>
+        /// Add NUIWidgetApplication event to Application.
+        /// Put each type of event callback in Dictionary.
+        /// </summary>
+        /// <typeparam name="TEventArgs">Argument type for the event</typeparam>
+        /// <param name="evType">Type of event</param>
+        /// <param name="handler">Event callback</param>
+        public void AddEventHandler<TEventArgs>(EventType evType, Action<TEventArgs> handler) where TEventArgs : EventArgs
+        {
+            Handlers.Add(evType, handler);
+        }
+
+
+        /// <summary>
+        /// Dispose function.
+        /// </summary>
+        public void Dispose()
+        {
+            Tizen.Log.Fatal("NUI", "### NUIWidgetCoreBackend Dispose called");
+            if (_application != null)
+            {
+                _application.Dispose();
+            }
+        }
+
+        /// <summary>
+        /// Exit Application.
+        /// </summary>
+        public void Exit()
+        {
+            Tizen.Log.Fatal("NUI", "### NUIWidgetCoreBackend Exit called");
+            if (_application != null)
+            {
+                _application.Quit();
+            }
+        }
+
+        /// <summary>
+        /// Run Application.
+        /// </summary>
+        /// <param name="args">Arguments from commandline.</param>
+        public void Run(string[] args)
+        {
+            args[0] = Tizen.Applications.Application.Current.ApplicationInfo.ExecutablePath;
+            _application = WidgetApplication.NewWidgetApplication(args, _stylesheet);
+
+            TizenSynchronizationContext.Initialize();
+            _application.BatteryLow += OnBatteryLow;
+            _application.LanguageChanged += OnLanguageChanged;
+            _application.MemoryLow += OnMemoryLow;
+            _application.RegionChanged += OnRegionChanged; ;
+
+            _application.Init += OnInit;
+            _application.Terminate += OnTerminate;
+
+            _application.MainLoop();
+        }
+
+        private void OnInit(object sender, WidgetApplication.WidgetApplicationEventArgs e)
+        {
+            Log.Fatal("NUI", "NUIWidgetApplication OnPreCreated Called");
+            var preCreateHandler = Handlers[EventType.PreCreated] as Action;
+            preCreateHandler?.Invoke();
+
+            Log.Fatal("NUI", "NUIWidgetApplication OnCreate Called");
+            var createHandler = Handlers[EventType.Created] as Action;
+            createHandler?.Invoke();
+
+        }
+
+        private void OnTerminate(object sender, WidgetApplication.WidgetApplicationEventArgs e)
+        {
+            Log.Fatal("NUI", "NUIWidgetApplication OnTerminated Called");
+            var handler = Handlers[EventType.Terminated] as Action;
+            handler?.Invoke();
+        }
+
+        /// <summary>
+        /// Region changed event callback function.
+        /// </summary>
+        /// <param name="source">Application instance</param>
+        /// <param name="e">Event argument for RegionChanged</param>
+        private void OnRegionChanged(object sender, WidgetApplication.WidgetApplicationEventArgs e)
+        {
+            Log.Fatal("NUI", "NUIWidgetApplication OnRegionChanged Called");
+            var handler = Handlers[EventType.RegionFormatChanged] as Action<RegionFormatChangedEventArgs>;
+            // Need to make new signal return in native to return right value.
+            handler?.Invoke(new RegionFormatChangedEventArgs(""));
+        }
+
+        /// <summary>
+        /// Memory Low event callback function.
+        /// </summary>
+        /// <param name="source">Application instance</param>
+        /// <param name="e">Event argument for MemoryLow</param>
+        private void OnMemoryLow(object sender, WidgetApplication.WidgetApplicationEventArgs e)
+        {
+            Log.Fatal("NUI", "NUIWidgetApplication OnMemoryLow Called");
+            var handler = Handlers[EventType.LowMemory] as Action<LowMemoryEventArgs>;
+            // Need to make new signal return in native to return right value.
+            handler?.Invoke(new LowMemoryEventArgs(LowMemoryStatus.None));
+        }
+
+        /// <summary>
+        /// Language changed event callback function.
+        /// </summary>
+        /// <param name="source">Application instance</param>
+        /// <param name="e">Event argument for LanguageChanged</param>
+        private void OnLanguageChanged(object sender, WidgetApplication.WidgetApplicationEventArgs e)
+        {
+
+            Log.Fatal("NUI", "NUIWidgetApplication OnLanguageChanged Called");
+            var handler = Handlers[EventType.LocaleChanged] as Action<LocaleChangedEventArgs>;
+            // Need to make new signal return in native to return right value.
+            handler?.Invoke(new LocaleChangedEventArgs(""));
+
+        }
+
+        /// <summary>
+        /// Battery low event callback function.
+        /// </summary>
+        /// <param name="source">Application instance</param>
+        /// <param name="e">Event argument for BatteryLow</param>
+        private void OnBatteryLow(object sender, WidgetApplication.WidgetApplicationEventArgs e)
+        {
+            Log.Fatal("NUI", "NUIWidgetApplication OnBatteryLow Called");
+            var handler = Handlers[EventType.LowBattery] as Action<LowBatteryEventArgs>;
+            // Need to make new signal return in native to return right value.
+            handler?.Invoke(new LowBatteryEventArgs(LowBatteryStatus.None));
+
+        }
+
+        internal WidgetApplication WidgetApplicationHandle
+        {
+            get
+            {
+                return _application;
+            }
+        }
+    }
+}
diff --git a/src/Tizen.NUI/src/internal/SWIGTYPE_p_bundle.cs b/src/Tizen.NUI/src/internal/SWIGTYPE_p_bundle.cs
new file mode 100755 (executable)
index 0000000..2c1c4d0
--- /dev/null
@@ -0,0 +1,40 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+namespace Tizen.NUI
+{
+
+    public class SWIGTYPE_p_bundle
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+
+        internal SWIGTYPE_p_bundle(global::System.IntPtr cPtr, bool futureUse)
+        {
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        protected SWIGTYPE_p_bundle()
+        {
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_bundle obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+    }
+
+}
index 956a3c6..e0f21c5 100755 (executable)
@@ -151,7 +151,7 @@ namespace Tizen.NUI
             get
             {
                 global::System.IntPtr cPtr = NDalicPINVOKE.TouchPoint_hitActor_get(swigCPtr);
-                View ret = (cPtr == global::System.IntPtr.Zero) ? null : Registry.GetManagedBaseHandleFromRefObject(cPtr) as View;
+                View ret = (cPtr == global::System.IntPtr.Zero) ? null : Registry.GetManagedBaseHandleFromNativePtr(cPtr) as View;
                 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
                 return ret;
             }
index 94e182e..361ce7e 100755 (executable)
@@ -215,7 +215,7 @@ namespace Tizen.NUI
         public VisualBase GetVisual(int index)
         {
             System.IntPtr cPtr = NDalicManualPINVOKE.ViewWrapperImpl_GetVisual(swigCPtr, index);
-            VisualBase ret = Registry.GetManagedBaseHandleFromRefObject(cPtr) as VisualBase;
+            VisualBase ret = Registry.GetManagedBaseHandleFromNativePtr(cPtr) as VisualBase;
 
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
             return ret;
diff --git a/src/Tizen.NUI/src/internal/WidgetApplication.cs b/src/Tizen.NUI/src/internal/WidgetApplication.cs
new file mode 100755 (executable)
index 0000000..9d16fd9
--- /dev/null
@@ -0,0 +1,576 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+using System;
+using System.Runtime.InteropServices;
+
+namespace Tizen.NUI
+{
+    /// <summary>
+    /// Widget application
+    /// </summary>
+    internal class WidgetApplication : BaseHandle
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+
+        internal WidgetApplication(global::System.IntPtr cPtr, bool cMemoryOwn) : base(NDalicManualPINVOKE.WidgetApplication_SWIGUpcast(cPtr), cMemoryOwn)
+        {
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WidgetApplication obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        /// <summary>
+        /// To make Window instance be disposed.
+        /// </summary>
+        protected override void Dispose(DisposeTypes type)
+        {
+            if(disposed)
+            {
+                return;
+            }
+
+            if(type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (_initCallback != null)
+            {
+                this.InitSignal().Disconnect(_initCallback);
+            }
+            if (_terminateCallback != null)
+            {
+                this.TerminateSignal().Disconnect(_terminateCallback);
+            }
+            if (_languageChangedCallback != null)
+            {
+                this.LanguageChangedSignal().Disconnect(_languageChangedCallback);;
+            }
+            if (_regionChangedCallback != null)
+            {
+                this.RegionChangedSignal().Disconnect(_regionChangedCallback);
+            }
+            if (_batteryLowCallback != null)
+            {
+                this.BatteryLowSignal().Disconnect(_batteryLowCallback);
+            }
+            if (_memoryLowCallback != null)
+            {
+                this.MemoryLowSignal().Disconnect(_memoryLowCallback);
+            }
+            
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                if (swigCMemOwn)
+                {
+                    swigCMemOwn = false;
+                    NDalicManualPINVOKE.delete_WidgetApplication(swigCPtr);
+                }
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            base.Dispose(type);
+        }
+
+        internal static WidgetApplication GetWidgetApplicationFromPtr(global::System.IntPtr cPtr)
+        {
+            WidgetApplication ret = new WidgetApplication(cPtr, false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public static WidgetApplication instance
+        {
+            get
+            {
+                return _instance;
+            }
+        }
+
+        internal void SetupDelegates()
+        {
+            InitDelegateInternal initializeCallback = new InitDelegateInternal(Initialization);
+
+            NUILog.Debug("InitSignal connection count");
+            this.InitSignal().Connect(initializeCallback);
+            NUILog.Debug("InitSignal connection count = " + InitSignal().GetConnectionCount());
+        }
+
+        public static WidgetApplication NewWidgetApplication(string[] args, string stylesheet)
+        {
+            WidgetApplication ret = New(args, stylesheet);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+
+            // we've got an application now connect the signals
+            ret.SetupDelegates();
+            _instance = ret;
+            return ret;
+        }
+
+        public static WidgetApplication New(string[] args, string stylesheet)
+        {
+            int argc = args.Length;
+            string argvStr = string.Join(" ", args);
+
+            WidgetApplication ret = new WidgetApplication(NDalicManualPINVOKE.WidgetApplication_New(argc, argvStr, stylesheet), true);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+        internal WidgetApplication(WidgetApplication widgetApplication) : this(NDalicManualPINVOKE.new_WidgetApplication__SWIG_1(WidgetApplication.getCPtr(widgetApplication)), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        internal WidgetApplication Assign(WidgetApplication widgetApplication)
+        {
+            WidgetApplication ret = new WidgetApplication(NDalicManualPINVOKE.WidgetApplication_Assign(swigCPtr, WidgetApplication.getCPtr(widgetApplication)), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// This starts the application.
+        /// </summary>
+        public void MainLoop()
+        {
+            NDalicManualPINVOKE.WidgetApplication_MainLoop(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+            {
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        /// <summary>
+        /// This quits the application.
+        /// Tizen applications should use Lower to improve re-start performance unless they need to Quit completely.
+        /// </summary>
+        public void Quit()
+        {
+            NDalicManualPINVOKE.WidgetApplication_Quit(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Get window.
+        /// </summary>
+        /// <returns> The window for widget instance.</returns>
+        public Window GetWindow()
+        {
+            Window ret = new Window(NDalicManualPINVOKE.WidgetApplication_GetWindow(swigCPtr), true);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Get path application resources are stored at.
+        /// </summary>
+        /// <returns>The full path of the resources</returns>
+        public static string GetResourcePath()
+        {
+            string ret = NDalicManualPINVOKE.WidgetApplication_GetResourcePath();
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Event arguments that passed via widget app event signal.
+        /// </summary>
+        public class WidgetApplicationEventArgs : EventArgs
+        {
+            /// <summary>
+            /// Widget application.
+            /// </summary>
+            public WidgetApplication WidgetApplication
+            {
+                get;
+                set;
+            }
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void InitCallbackType(IntPtr widgetApplication);
+        private InitCallbackType _initCallback;
+        private DaliEventHandler<object,WidgetApplicationEventArgs> _initEventHandler;
+
+        /// <summary>
+        /// Init event.
+        /// </summary>
+        public event DaliEventHandler<object, WidgetApplicationEventArgs> Init
+        {
+            add
+            {
+                if (_initEventHandler == null)
+                {
+                    _initCallback = new InitCallbackType( OnInit);
+                    InitSignal().Connect(_initCallback);
+                }
+
+                _initEventHandler += value;
+            }
+
+            remove
+            {
+                _initEventHandler -= value;
+
+                if (_initEventHandler == null && InitSignal().Empty() == false)
+                {
+                   InitSignal().Disconnect(_initCallback);
+                }
+            }
+        }
+
+        private void OnInit(IntPtr widgetApplication)
+        {
+            WidgetApplicationEventArgs e = new WidgetApplicationEventArgs();
+            if (widgetApplication != null)
+            {
+                e.WidgetApplication = WidgetApplication.GetWidgetApplicationFromPtr(widgetApplication);
+            }
+
+            if (_initEventHandler != null)
+            {
+                _initEventHandler(this, e);
+            }
+        }
+
+        internal AppSignalType InitSignal()
+        {
+            AppSignalType ret = new AppSignalType(NDalicManualPINVOKE.WidgetApplication_InitSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void TerminateCallbackType(IntPtr widgetApplication);
+        private TerminateCallbackType _terminateCallback;
+        private DaliEventHandler<object, WidgetApplicationEventArgs> _terminateEventHandler;
+
+        /// <summary>
+        /// Terminate event.
+        /// </summary>
+        public event DaliEventHandler<object, WidgetApplicationEventArgs> Terminate
+        {
+            add
+            {
+                if (_terminateEventHandler == null)
+                {
+                    _terminateCallback = new TerminateCallbackType( OnTerminate);
+                    TerminateSignal().Connect(_terminateCallback);
+                }
+
+                _terminateEventHandler += value;
+            }
+
+            remove
+            {
+                _terminateEventHandler -= value;
+
+                if (_terminateEventHandler == null && TerminateSignal().Empty() == false)
+                {
+                   TerminateSignal().Disconnect(_terminateCallback);
+                }
+            }
+        }
+
+        private void OnTerminate(IntPtr widgetApplication)
+        {
+            WidgetApplicationEventArgs e = new WidgetApplicationEventArgs();
+
+            if (widgetApplication != null)
+            {
+                e.WidgetApplication = WidgetApplication.GetWidgetApplicationFromPtr(widgetApplication);
+            }
+
+            if (_terminateEventHandler != null)
+            {
+                _terminateEventHandler(this, e);
+            }
+        }
+
+        internal AppSignalType TerminateSignal()
+        {
+            AppSignalType ret = new AppSignalType(NDalicManualPINVOKE.WidgetApplication_TerminateSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void LanguageChangedCallbackType(IntPtr widgetApplication);
+        private LanguageChangedCallbackType _languageChangedCallback;
+        private DaliEventHandler<object, WidgetApplicationEventArgs> _languageChangedEventHandler;
+
+        /// <summary>
+        /// LanguageChanged event.
+        /// </summary>
+        public event DaliEventHandler<object, WidgetApplicationEventArgs> LanguageChanged
+        {
+            add
+            {
+                if (_languageChangedEventHandler == null)
+                {
+                    _languageChangedCallback = new LanguageChangedCallbackType( OnLanguageChanged);
+                    LanguageChangedSignal().Connect(_languageChangedCallback);
+                }
+
+                _languageChangedEventHandler += value;
+            }
+
+            remove
+            {
+                _languageChangedEventHandler -= value;
+
+                if (_languageChangedEventHandler == null && LanguageChangedSignal().Empty() == false)
+                {
+                   LanguageChangedSignal().Disconnect(_languageChangedCallback);
+                }
+            }
+        }
+
+        private void OnLanguageChanged(IntPtr widgetApplication)
+        {
+            WidgetApplicationEventArgs e = new WidgetApplicationEventArgs();
+
+            if (widgetApplication != null)
+            {
+                e.WidgetApplication = WidgetApplication.GetWidgetApplicationFromPtr(widgetApplication);
+            }
+
+            if (_languageChangedEventHandler != null)
+            {
+                _languageChangedEventHandler(this, e);
+            }
+        }
+
+        internal AppSignalType LanguageChangedSignal()
+        {
+            AppSignalType ret = new AppSignalType(NDalicManualPINVOKE.WidgetApplication_LanguageChangedSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void RegionChangedCallbackType(IntPtr widgetApplication);
+        private RegionChangedCallbackType _regionChangedCallback;
+        private DaliEventHandler<object, WidgetApplicationEventArgs> _regionChangedEventHandler;
+
+        /// <summary>
+        /// RegionChanged event.
+        /// </summary>
+        public event DaliEventHandler<object, WidgetApplicationEventArgs> RegionChanged
+        {
+            add
+            {
+                if (_regionChangedEventHandler == null)
+                {
+                    _regionChangedCallback = new RegionChangedCallbackType( OnRegionChanged );
+                    RegionChangedSignal().Connect(_regionChangedCallback);
+                }
+
+                _regionChangedEventHandler += value;
+            }
+
+            remove
+            {
+                _regionChangedEventHandler -= value;
+
+                if (_regionChangedEventHandler == null && RegionChangedSignal().Empty() == false)
+                {
+                   RegionChangedSignal().Disconnect(_regionChangedCallback);
+                }
+            }
+        }
+
+        private void OnRegionChanged(IntPtr widgetApplication)
+        {
+            WidgetApplicationEventArgs e = new WidgetApplicationEventArgs();
+
+            if (widgetApplication != null)
+            {
+                e.WidgetApplication = WidgetApplication.GetWidgetApplicationFromPtr(widgetApplication);
+            }
+
+            if (_regionChangedEventHandler != null)
+            {
+                _regionChangedEventHandler(this, e);
+            }
+        }
+
+        internal AppSignalType RegionChangedSignal()
+        {
+            AppSignalType ret = new AppSignalType(NDalicManualPINVOKE.WidgetApplication_RegionChangedSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void BatteryLowCallbackType(IntPtr widgetApplication);
+        private BatteryLowCallbackType _batteryLowCallback;
+        private DaliEventHandler<object, WidgetApplicationEventArgs> _batteryLowEventHandler;
+
+        /// <summary>
+        /// BatteryLow event.
+        /// </summary>
+        public event DaliEventHandler<object, WidgetApplicationEventArgs> BatteryLow
+        {
+            add
+            {
+                if (_batteryLowEventHandler == null)
+                {
+                    _batteryLowCallback = new BatteryLowCallbackType( OnBatteryLow );
+                    BatteryLowSignal().Connect(_batteryLowCallback);
+                }
+
+                _batteryLowEventHandler += value;
+            }
+
+            remove
+            {
+                _batteryLowEventHandler -= value;
+
+                if (_batteryLowEventHandler == null && BatteryLowSignal().Empty() == false)
+                {
+                   BatteryLowSignal().Disconnect(_batteryLowCallback);
+                }
+            }
+        }
+
+        private void OnBatteryLow(IntPtr widgetApplication)
+        {
+            WidgetApplicationEventArgs e = new WidgetApplicationEventArgs();
+
+            if (widgetApplication != null)
+            {
+                e.WidgetApplication = WidgetApplication.GetWidgetApplicationFromPtr(widgetApplication);
+            }
+
+            if (_batteryLowEventHandler != null)
+            {
+                _batteryLowEventHandler(this, e);
+            }
+        }
+
+        internal AppSignalType BatteryLowSignal()
+        {
+            AppSignalType ret = new AppSignalType(NDalicManualPINVOKE.WidgetApplication_BatteryLowSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void MemoryLowCallbackType(IntPtr widgetApplication);
+        private MemoryLowCallbackType _memoryLowCallback;
+        private DaliEventHandler<object, WidgetApplicationEventArgs> _memoryLowEventHandler;
+
+        /// <summary>
+        /// MemoryLow event.
+        /// </summary>
+        public event DaliEventHandler<object, WidgetApplicationEventArgs> MemoryLow
+        {
+            add
+            {
+                if (_memoryLowEventHandler == null)
+                {
+                    _memoryLowCallback = new MemoryLowCallbackType (OnMemoryLow);
+                    MemoryLowSignal().Connect(_memoryLowCallback);
+                }
+
+                _memoryLowEventHandler += value;
+            }
+
+            remove
+            {
+                _memoryLowEventHandler -= value;
+
+                if (_memoryLowEventHandler == null && MemoryLowSignal().Empty() == false)
+                {
+                   MemoryLowSignal().Disconnect(_memoryLowCallback);
+                }
+            }
+        }
+
+        private void OnMemoryLow(IntPtr widgetApplication)
+        {
+            WidgetApplicationEventArgs e = new WidgetApplicationEventArgs();
+
+            if (widgetApplication != null)
+            {
+                e.WidgetApplication = WidgetApplication.GetWidgetApplicationFromPtr(widgetApplication);
+            }
+
+            if (_memoryLowEventHandler != null)
+            {
+                _memoryLowEventHandler(this, e);
+            }
+        }
+
+        internal AppSignalType MemoryLowSignal()
+        {
+            AppSignalType ret = new AppSignalType(NDalicManualPINVOKE.WidgetApplication_MemoryLowSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public delegate void InitDelegate();
+
+        public delegate void TerminateDelegate();
+
+        public delegate void LanguageChangedDelegate();
+
+        public delegate void RegionChangedDelegate();
+
+        public delegate void BatteryLowDelegate();
+
+        public delegate void MemoryLowDelegate();
+
+        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
+        internal delegate void InitDelegateInternal();
+
+        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
+        internal delegate void TerminateDelegateInternal();
+
+        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
+        internal delegate void LanguageChangedDelegateInternal();
+
+        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
+        internal delegate void RegionChangedDelegateInternal();
+
+        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
+        internal delegate void BatteryLowDelegateInternal();
+
+        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
+        internal delegate void MemoryLowDelegateInternal();
+
+        static void Initialization()
+        {
+            // instance.InitDelegate();
+        }
+
+        private static WidgetApplication _instance; //singleton
+
+    }
+
+}
diff --git a/src/Tizen.NUI/src/internal/WidgetInstanceCreateSignalType.cs b/src/Tizen.NUI/src/internal/WidgetInstanceCreateSignalType.cs
new file mode 100755 (executable)
index 0000000..16543dd
--- /dev/null
@@ -0,0 +1,143 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+namespace Tizen.NUI
+{
+
+    internal class WidgetInstanceCreateSignalType : global::System.IDisposable
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+        protected bool swigCMemOwn;
+
+        internal WidgetInstanceCreateSignalType(global::System.IntPtr cPtr, bool cMemoryOwn)
+        {
+            swigCMemOwn = cMemoryOwn;
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WidgetInstanceCreateSignalType obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        //A Flag to check who called Dispose(). (By User or DisposeQueue)
+        private bool isDisposeQueued = false;
+        //A Flat to check if it is already disposed.
+        protected bool disposed = false;
+
+        ~WidgetInstanceCreateSignalType()
+        {
+            if (!isDisposeQueued)
+            {
+                isDisposeQueued = true;
+                DisposeQueue.Instance.Add(this);
+            }
+        }
+
+        public void Dispose()
+        {
+            //Throw excpetion if Dispose() is called in separate thread.
+            if (!Window.IsInstalled())
+            {
+                throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
+            }
+
+            if (isDisposeQueued)
+            {
+                Dispose(DisposeTypes.Implicit);
+            }
+            else
+            {
+                Dispose(DisposeTypes.Explicit);
+                System.GC.SuppressFinalize(this);
+            }
+        }
+
+        protected virtual void Dispose(DisposeTypes type)
+        {
+            if (disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                swigCMemOwn = false;
+                NDalicManualPINVOKE.delete_WidgetInstanceCreateSignalType(swigCPtr);
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            disposed = true;
+        }
+
+        public bool Empty()
+        {
+            bool ret = NDalicManualPINVOKE.WidgetInstanceCreateSignalType_Empty(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public uint GetConnectionCount()
+        {
+            uint ret = NDalicManualPINVOKE.WidgetInstanceCreateSignalType_GetConnectionCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public void Connect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceCreateSignalType_Connect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Disconnect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceCreateSignalType_Disconnect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Emit(WidgetData arg1, SWIGTYPE_p_bundle arg2, Uint16Pair arg3)
+        {
+            NDalicManualPINVOKE.WidgetInstanceCreateSignalType_Emit(swigCPtr, WidgetData.getCPtr(arg1), SWIGTYPE_p_bundle.getCPtr(arg2), Uint16Pair.getCPtr(arg3));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        public WidgetInstanceCreateSignalType() : this(NDalicManualPINVOKE.new_WidgetInstanceCreateSignalType(), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+    }
+
+}
diff --git a/src/Tizen.NUI/src/internal/WidgetInstancePauseOrResumeSignalType.cs b/src/Tizen.NUI/src/internal/WidgetInstancePauseOrResumeSignalType.cs
new file mode 100755 (executable)
index 0000000..49a170b
--- /dev/null
@@ -0,0 +1,143 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+namespace Tizen.NUI
+{
+
+    internal class WidgetInstancePauseOrResumeSignalType : global::System.IDisposable
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+        protected bool swigCMemOwn;
+
+        internal WidgetInstancePauseOrResumeSignalType(global::System.IntPtr cPtr, bool cMemoryOwn)
+        {
+            swigCMemOwn = cMemoryOwn;
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WidgetInstancePauseOrResumeSignalType obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        //A Flag to check who called Dispose(). (By User or DisposeQueue)
+        private bool isDisposeQueued = false;
+        //A Flat to check if it is already disposed.
+        protected bool disposed = false;
+
+        ~WidgetInstancePauseOrResumeSignalType()
+        {
+            if (!isDisposeQueued)
+            {
+                isDisposeQueued = true;
+                DisposeQueue.Instance.Add(this);
+            }
+        }
+
+        public void Dispose()
+        {
+            //Throw excpetion if Dispose() is called in separate thread.
+            if (!Window.IsInstalled())
+            {
+                throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
+            }
+
+            if (isDisposeQueued)
+            {
+                Dispose(DisposeTypes.Implicit);
+            }
+            else
+            {
+                Dispose(DisposeTypes.Explicit);
+                System.GC.SuppressFinalize(this);
+            }
+        }
+
+        protected virtual void Dispose(DisposeTypes type)
+        {
+            if (disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                swigCMemOwn = false;
+                NDalicManualPINVOKE.delete_WidgetInstancePauseOrResumeSignalType(swigCPtr);
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            disposed = true;
+        }
+
+        public bool Empty()
+        {
+            bool ret = NDalicManualPINVOKE.WidgetInstancePauseOrResumeSignalType_Empty(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public uint GetConnectionCount()
+        {
+            uint ret = NDalicManualPINVOKE.WidgetInstancePauseOrResumeSignalType_GetConnectionCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public void Connect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstancePauseOrResumeSignalType_Connect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Disconnect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstancePauseOrResumeSignalType_Disconnect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Emit(WidgetData arg)
+        {
+            NDalicManualPINVOKE.WidgetInstancePauseOrResumeSignalType_Emit(swigCPtr, WidgetData.getCPtr(arg));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        public WidgetInstancePauseOrResumeSignalType() : this(NDalicManualPINVOKE.new_WidgetInstancePauseOrResumeSignalType(), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+    }
+
+}
diff --git a/src/Tizen.NUI/src/internal/WidgetInstanceResizeSignalType.cs b/src/Tizen.NUI/src/internal/WidgetInstanceResizeSignalType.cs
new file mode 100755 (executable)
index 0000000..0685f80
--- /dev/null
@@ -0,0 +1,142 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+namespace Tizen.NUI
+{
+
+    internal class WidgetInstanceResizeSignalType : global::System.IDisposable
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+        protected bool swigCMemOwn;
+
+        internal WidgetInstanceResizeSignalType(global::System.IntPtr cPtr, bool cMemoryOwn)
+        {
+            swigCMemOwn = cMemoryOwn;
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WidgetInstanceResizeSignalType obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        //A Flag to check who called Dispose(). (By User or DisposeQueue)
+        private bool isDisposeQueued = false;
+        //A Flat to check if it is already disposed.
+        protected bool disposed = false;
+
+        ~WidgetInstanceResizeSignalType()
+        {
+            if (!isDisposeQueued)
+            {
+                isDisposeQueued = true;
+                DisposeQueue.Instance.Add(this);
+            }
+        }
+        public void Dispose()
+        {
+            //Throw excpetion if Dispose() is called in separate thread.
+            if (!Window.IsInstalled())
+            {
+                throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
+            }
+
+            if (isDisposeQueued)
+            {
+                Dispose(DisposeTypes.Implicit);
+            }
+            else
+            {
+                Dispose(DisposeTypes.Explicit);
+                System.GC.SuppressFinalize(this);
+            }
+        }
+
+        protected virtual void Dispose(DisposeTypes type)
+        {
+            if (disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                swigCMemOwn = false;
+                NDalicManualPINVOKE.delete_WidgetInstanceResizeSignalType(swigCPtr);
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            disposed = true;
+        }
+
+        public bool Empty()
+        {
+            bool ret = NDalicManualPINVOKE.WidgetInstanceResizeSignalType_Empty(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public uint GetConnectionCount()
+        {
+            uint ret = NDalicManualPINVOKE.WidgetInstanceResizeSignalType_GetConnectionCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public void Connect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceResizeSignalType_Connect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Disconnect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceResizeSignalType_Disconnect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Emit(WidgetData arg1, Uint16Pair arg2)
+        {
+            NDalicManualPINVOKE.WidgetInstanceResizeSignalType_Emit(swigCPtr, WidgetData.getCPtr(arg1), Uint16Pair.getCPtr(arg2));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        public WidgetInstanceResizeSignalType() : this(NDalicManualPINVOKE.new_WidgetInstanceResizeSignalType(), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+    }
+
+}
diff --git a/src/Tizen.NUI/src/internal/WidgetInstanceTerminateSignalType.cs b/src/Tizen.NUI/src/internal/WidgetInstanceTerminateSignalType.cs
new file mode 100755 (executable)
index 0000000..1e4327f
--- /dev/null
@@ -0,0 +1,142 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+namespace Tizen.NUI
+{
+
+    internal class WidgetInstanceTerminateSignalType : global::System.IDisposable
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+        protected bool swigCMemOwn;
+
+        internal WidgetInstanceTerminateSignalType(global::System.IntPtr cPtr, bool cMemoryOwn)
+        {
+            swigCMemOwn = cMemoryOwn;
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WidgetInstanceTerminateSignalType obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        //A Flag to check who called Dispose(). (By User or DisposeQueue)
+        private bool isDisposeQueued = false;
+        //A Flat to check if it is already disposed.
+        protected bool disposed = false;
+
+        ~WidgetInstanceTerminateSignalType()
+        {
+            if (!isDisposeQueued)
+            {
+                isDisposeQueued = true;
+                DisposeQueue.Instance.Add(this);
+            }
+        }
+
+        public void Dispose()
+        {
+            //Throw excpetion if Dispose() is called in separate thread.
+            if (!Window.IsInstalled())
+            {
+                throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
+            }
+
+            if (isDisposeQueued)
+            {
+                Dispose(DisposeTypes.Implicit);
+            }
+            else
+            {
+                Dispose(DisposeTypes.Explicit);
+                System.GC.SuppressFinalize(this);
+            }
+        }
+
+        protected virtual void Dispose(DisposeTypes type)
+        {
+            if (disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                swigCMemOwn = false;
+                NDalicManualPINVOKE.delete_WidgetInstanceTerminateSignalType(swigCPtr);
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            disposed = true;
+        }
+
+        public bool Empty()
+        {
+            bool ret = NDalicManualPINVOKE.WidgetInstanceTerminateSignalType_Empty(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public uint GetConnectionCount()
+        {
+            uint ret = NDalicManualPINVOKE.WidgetInstanceTerminateSignalType_GetConnectionCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public void Connect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceTerminateSignalType_Connect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Disconnect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceTerminateSignalType_Disconnect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Emit(WidgetData arg1, SWIGTYPE_p_bundle arg2, Widget.WidgetTerminateType arg3)
+        {
+            NDalicManualPINVOKE.WidgetInstanceTerminateSignalType_Emit(swigCPtr, WidgetData.getCPtr(arg1), SWIGTYPE_p_bundle.getCPtr(arg2), (int)arg3);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        public WidgetInstanceTerminateSignalType() : this(NDalicManualPINVOKE.new_WidgetInstanceTerminateSignalType(), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+    }
+
+}
diff --git a/src/Tizen.NUI/src/internal/WidgetInstanceUpdateSignalType.cs b/src/Tizen.NUI/src/internal/WidgetInstanceUpdateSignalType.cs
new file mode 100755 (executable)
index 0000000..26480b5
--- /dev/null
@@ -0,0 +1,143 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+namespace Tizen.NUI
+{
+
+    internal class WidgetInstanceUpdateSignalType : global::System.IDisposable
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+        protected bool swigCMemOwn;
+
+        internal WidgetInstanceUpdateSignalType(global::System.IntPtr cPtr, bool cMemoryOwn)
+        {
+            swigCMemOwn = cMemoryOwn;
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WidgetInstanceUpdateSignalType obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        //A Flag to check who called Dispose(). (By User or DisposeQueue)
+        private bool isDisposeQueued = false;
+        //A Flat to check if it is already disposed.
+        protected bool disposed = false;
+
+        ~WidgetInstanceUpdateSignalType()
+        {
+            if (!isDisposeQueued)
+            {
+                isDisposeQueued = true;
+                DisposeQueue.Instance.Add(this);
+            }
+        }
+
+        public void Dispose()
+        {
+            //Throw excpetion if Dispose() is called in separate thread.
+            if (!Window.IsInstalled())
+            {
+                throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
+            }
+
+            if (isDisposeQueued)
+            {
+                Dispose(DisposeTypes.Implicit);
+            }
+            else
+            {
+                Dispose(DisposeTypes.Explicit);
+                System.GC.SuppressFinalize(this);
+            }
+        }
+
+        protected virtual void Dispose(DisposeTypes type)
+        {
+            if (disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                swigCMemOwn = false;
+                NDalicManualPINVOKE.delete_WidgetInstanceUpdateSignalType(swigCPtr);
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            disposed = true;
+        }
+
+        public bool Empty()
+        {
+            bool ret = NDalicManualPINVOKE.WidgetInstanceUpdateSignalType_Empty(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public uint GetConnectionCount()
+        {
+            uint ret = NDalicManualPINVOKE.WidgetInstanceUpdateSignalType_GetConnectionCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        public void Connect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceUpdateSignalType_Connect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Disconnect(System.Delegate func)
+        {
+            System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(func);
+            {
+                NDalicManualPINVOKE.WidgetInstanceUpdateSignalType_Disconnect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
+                if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            }
+        }
+
+        public void Emit(WidgetData arg1, SWIGTYPE_p_bundle arg2, int arg3)
+        {
+            NDalicManualPINVOKE.WidgetInstanceUpdateSignalType_Emit(swigCPtr, WidgetData.getCPtr(arg1), SWIGTYPE_p_bundle.getCPtr(arg2), arg3);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        public WidgetInstanceUpdateSignalType() : this(NDalicManualPINVOKE.new_WidgetInstanceUpdateSignalType(), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+    }
+
+}
index be7d0dd..01525ed 100755 (executable)
@@ -18,37 +18,37 @@ namespace System
 {
     public class ApplicationException : Exception
     {
-        public ApplicationException()
+        public ApplicationException(): base()
         {
-            new global::System.ApplicationException();
+            //add anything required
         }
 
-        public ApplicationException(string message)
+        public ApplicationException(string message): base(message)
         {
-            new global::System.ApplicationException(message);
+            //add anything required
         }
 
-        public ApplicationException(string message, Exception innerException)
+        public ApplicationException(string message, Exception innerException): base(message, innerException)
         {
-            new global::System.ApplicationException(message, innerException);
+            //add anything required
         }
     }
 
     public class SystemException : Exception
     {
-        public SystemException()
+        public SystemException(): base()
         {
-            new global::System.SystemException();
+            //add anything required
         }
 
-        public SystemException(string message)
+        public SystemException(string message): base(message)
         {
-            new global::System.SystemException(message);
+            //add anything required
         }
 
-        public SystemException(string message, Exception innerException)
+        public SystemException(string message, Exception innerException): base(message, innerException)
         {
-            new global::System.SystemException(message, innerException);
+            //add anything required
         }
     }
 }
index b0deba5..422e0ad 100755 (executable)
@@ -65,6 +65,17 @@ namespace Tizen.NUI
 
             }
 
+            if (_animationFinishedEventCallback != null)
+            {
+                FinishedSignal().Disconnect(_animationFinishedEventCallback);
+            }
+
+            if (_animationProgressReachedEventCallback != null)
+            {
+
+                ProgressReachedSignal().Disconnect(_animationProgressReachedEventCallback);
+            }
+
             if(this)
             {
                 this.Clear();
@@ -73,7 +84,6 @@ namespace Tizen.NUI
                 //throw new System.InvalidOperationException("Animation Instance should not be disposed until getting Finished event. Should be a global variable");
             }
 
-
             //Release your own unmanaged resources here.
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
@@ -175,7 +185,7 @@ namespace Tizen.NUI
                 if (_animationProgressReachedEventHandler == null && ProgressReachedSignal().Empty() == false)
                 {
                     NUILog.Debug("[remove before]ProgressReachedSignal().Empty=" + FinishedSignal().Empty() + " GetConnectionCount=" + FinishedSignal().GetConnectionCount());
-                    ProgressReachedSignal().Disconnect(_animationProgressReachedEventHandler);
+                    ProgressReachedSignal().Disconnect(_animationProgressReachedEventCallback);
                     NUILog.Debug("[remove after]ProgressReachedSignal().Empty=" + FinishedSignal().Empty() + " GetConnectionCount=" + FinishedSignal().GetConnectionCount());
                 }
             }
@@ -879,6 +889,23 @@ namespace Tizen.NUI
             return ret;
         }
 
+        private static bool? disableAnimation = null;
+        private bool DisableAnimation
+        {
+            get
+            {
+                if (disableAnimation.HasValue == false)
+                {
+                    string type = Environment.GetEnvironmentVariable("PlatformSmartType");
+                    if (type == "Entry")
+                        disableAnimation = true;
+                    else
+                        disableAnimation = false;
+                }
+                return disableAnimation.Value;
+            }
+        }
+
         /// <summary>
         /// Plays the animation.
         /// </summary>
@@ -886,9 +913,9 @@ namespace Tizen.NUI
         {
             NDalicPINVOKE.Animation_Play(swigCPtr);
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-#if DISABLE_ANIMATION
-            Stop(EndActions.StopFinal);
-#endif
+
+            if (DisableAnimation == true)
+                Stop(EndActions.StopFinal);
         }
 
         /// <summary>
@@ -908,10 +935,10 @@ namespace Tizen.NUI
         /// The delay time is not included in the looping time.<br/>
         /// When the delay time is negative value, it would treat as play immediately.<br/>
         /// </summary>
-        /// <param name="delayMiliSeconds">The delay time</param>
-        public void PlayAfter(int delayMiliSeconds)
+        /// <param name="delayMilliseconds">The delay time</param>
+        public void PlayAfter(int delayMilliseconds)
         {
-            NDalicPINVOKE.Animation_PlayAfter(swigCPtr, MilliSecondsToSeconds(delayMiliSeconds));
+            NDalicPINVOKE.Animation_PlayAfter(swigCPtr, MilliSecondsToSeconds(delayMilliseconds));
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
index 37b8cfd..3803986 100755 (executable)
@@ -53,6 +53,8 @@ namespace Tizen.NUI.BaseComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            DisConnectFromSignals();
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
@@ -66,6 +68,34 @@ namespace Tizen.NUI.BaseComponents
             base.Dispose(type);
         }
 
+        private void DisConnectFromSignals()
+        {
+            // Save current CPtr.
+            global::System.Runtime.InteropServices.HandleRef currentCPtr = swigCPtr;
+
+            // Use BaseHandle CPtr as current might have been deleted already in derived classes.
+            swigCPtr = GetBaseHandleCPtrHandleRef;
+
+            if (_scrollableCompletedCallbackDelegate != null)
+            {
+                this.ScrollCompletedSignal().Disconnect(_scrollableCompletedCallbackDelegate);
+            }
+
+            if (_scrollableUpdatedCallbackDelegate != null)
+            {
+                this.ScrollUpdatedSignal().Disconnect(_scrollableUpdatedCallbackDelegate);
+            }
+
+            if (_scrollableStartedCallbackDelegate != null)
+            {
+                this.ScrollStartedSignal().Disconnect(_scrollableStartedCallbackDelegate);
+            }
+
+            // BaseHandle CPtr is used in Registry and there is danger of deletion if we keep using it here.
+            // Restore current CPtr.
+            swigCPtr = currentCPtr;
+        }
+
         public class StartedEventArgs : EventArgs
         {
             private Vector2 _vector2;
index 5ccab67..11e8199 100755 (executable)
@@ -64,6 +64,11 @@ namespace Tizen.NUI.BaseComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_textEditorTextChangedCallbackDelegate != null)
+            {
+                TextChangedSignal().Disconnect(_textEditorTextChangedCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
@@ -1342,9 +1347,9 @@ namespace Tizen.NUI.BaseComponents
                 }
                 switch (temp)
                 {
-                    case "WORD":
+                    case "WRAP_MODE_WORD":
                     return LineWrapMode.Word;
-                    case "CHARACTER":
+                    case "WRAP_MODE_CHARACTER":
                     return LineWrapMode.Character;
                     default:
                     return LineWrapMode.Word;
@@ -1357,12 +1362,12 @@ namespace Tizen.NUI.BaseComponents
                 {
                     case LineWrapMode.Word:
                     {
-                        temp = "WORD";
+                        temp = "WRAP_MODE_WORD";
                         break;
                     }
                     case LineWrapMode.Character:
                     {
-                        temp = "CHARACTER";
+                        temp = "WRAP_MODE_CHARACTER";
                         break;
                     }
                 }
index ba7d45c..09dc7d7 100755 (executable)
@@ -63,6 +63,16 @@ namespace Tizen.NUI.BaseComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_textFieldMaxLengthReachedCallbackDelegate != null)
+            {
+                this.MaxLengthReachedSignal().Disconnect(_textFieldMaxLengthReachedCallbackDelegate);
+            }
+
+            if (_textFieldTextChangedCallbackDelegate != null)
+            {
+                TextChangedSignal().Disconnect(_textFieldTextChangedCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index 4abad84..83931f8 100755 (executable)
@@ -757,6 +757,25 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
+        /// TextColorAnimatable property.<br>
+        /// The color of the text that can be animatated.<br>
+        /// Animation framework can be used to change the color of the text when not using mark up.<br>
+        /// Not possible when text is auto scrolling. <br>
+        /// </summary>
+        public Color TextColorAnimatable
+        {
+            get
+            {
+                Color animatableColor = new Color(0.0f, 0.0f, 0.0f, 0.0f);
+                GetProperty(TextLabel.Property.TEXT_COLOR_ANIMATABLE).Get(animatableColor);
+                return animatableColor;
+            }
+            set
+            {
+                SetProperty(TextLabel.Property.TEXT_COLOR_ANIMATABLE, new Tizen.NUI.PropertyValue(value));
+            }
+        }
+
         /// The line count of text.
         /// </summary>
         public int LineCount
@@ -784,9 +803,9 @@ namespace Tizen.NUI.BaseComponents
                 }
                 switch (temp)
                 {
-                    case "WORD":
+                    case "WRAP_MODE_WORD":
                     return LineWrapMode.Word;
-                    case "CHARACTER":
+                    case "WRAP_MODE_CHARACTER":
                     return LineWrapMode.Character;
                     default:
                     return LineWrapMode.Word;
@@ -811,25 +830,5 @@ namespace Tizen.NUI.BaseComponents
                 SetProperty(TextLabel.Property.LINE_WRAP_MODE, new Tizen.NUI.PropertyValue(temp));
             }
         }
-
-        /// TextColorAnimatable property.<br>
-        /// The color of the text that can be animatated.<br>
-        /// Animation framework can be used to change the color of the text when not using mark up.<br>
-        /// Not possible when text is auto scrolling. <br>
-        /// </summary>
-        public Color TextColorAnimatable
-        {
-            get
-            {
-                Color animatableColor = new Color(0.0f, 0.0f, 0.0f, 0.0f);
-                GetProperty(TextLabel.Property.TEXT_COLOR_ANIMATABLE).Get(animatableColor);
-                return animatableColor;
-            }
-            set
-            {
-                SetProperty(TextLabel.Property.TEXT_COLOR_ANIMATABLE, new Tizen.NUI.PropertyValue(value));
-            }
-        }
-
     }
 }
index 0c8e0de..ae73ef1 100755 (executable)
@@ -55,6 +55,11 @@ namespace Tizen.NUI.BaseComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_videoViewFinishedCallbackDelegate != null)
+            {
+                FinishedSignal().Disconnect(_videoViewFinishedCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index cedb4d0..d4a2bec 100755 (executable)
@@ -20,12 +20,10 @@ namespace Tizen.NUI.BaseComponents
     using System;
     using System.Runtime.InteropServices;
 
-
-
     /// <summary>
     /// View is the base class for all views.
     /// </summary>
-    public class View : Animatable //CustomActor => Animatable
+    public class View : Container
     {
         private global::System.Runtime.InteropServices.HandleRef swigCPtr;
 
@@ -40,6 +38,88 @@ namespace Tizen.NUI.BaseComponents
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
         }
 
+        // From Container Base class
+
+        /// <summary>
+        /// Adds a child view to this View.
+        /// </summary>
+        /// <seealso cref="Container::Add()">
+        /// </seealso>
+        public override void Add(View child)
+        {
+            NDalicPINVOKE.Actor_Add(swigCPtr, View.getCPtr(child));
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Removes a child View from this View. If the view was not a child of this view, this is a no-op.
+        /// </summary>
+        /// <seealso cref="Container::Remove()">
+        /// </seealso>
+        public override void Remove(View child)
+        {
+            NDalicPINVOKE.Actor_Remove(swigCPtr, View.getCPtr(child));
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Retrieves child view by index.
+        /// </summary>
+        /// <seealso cref="Container::GetChildAt()">
+        /// </seealso>
+        public override View GetChildAt(uint index)
+        {
+            IntPtr cPtr = NDalicPINVOKE.Actor_GetChildAt(swigCPtr, index);
+
+            View ret = Registry.GetManagedBaseHandleFromNativePtr(cPtr) as View;
+
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret ?? null;
+        }
+
+        /// <summary>
+        /// Retrieves the number of children held by the view.
+        /// </summary>
+        /// <seealso cref="Container::GetChildCount()">
+        /// </seealso>
+        protected override uint GetChildCount()
+        {
+            uint ret = NDalicPINVOKE.Actor_GetChildCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Get the Views parent
+        /// </summary>
+        /// <seealso cref="Container::GetParent()">
+        protected override Container GetParent()
+        {
+            Container ret;
+            IntPtr cPtr = NDalicPINVOKE.Actor_GetParent(swigCPtr);
+
+            BaseHandle basehandle = Registry.GetManagedBaseHandleFromNativePtr(cPtr);
+
+            if(basehandle is Layer)
+            {
+                ret = basehandle as Layer;
+            }
+            else
+            {
+                ret = basehandle as View;
+            }
+
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        ///
+
         // you can override it to clean-up your own resources.
         protected override void Dispose(DisposeTypes type)
         {
@@ -59,6 +139,8 @@ namespace Tizen.NUI.BaseComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            DisConnectFromSignals();
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
@@ -72,6 +154,99 @@ namespace Tizen.NUI.BaseComponents
             base.Dispose(type);
         }
 
+        private void DisConnectFromSignals()
+        {
+            // Save current CPtr.
+            global::System.Runtime.InteropServices.HandleRef currentCPtr = swigCPtr;
+
+            // Use BaseHandle CPtr as current might have been deleted already in derived classes.
+            swigCPtr = GetBaseHandleCPtrHandleRef;
+
+            if (_onRelayoutEventCallback != null)
+            {
+                this.OnRelayoutSignal().Disconnect(_onRelayoutEventCallback);
+            }
+
+            if (_offWindowEventCallback != null)
+            {
+                this.OffWindowSignal().Disconnect(_offWindowEventCallback);
+            }
+
+            if (_onWindowEventCallback != null)
+            {
+                this.OnWindowSignal().Disconnect(_onWindowEventCallback);
+            }
+
+            if (_wheelEventCallback != null)
+            {
+                this.WheelEventSignal().Disconnect(_wheelEventCallback);
+            }
+
+            if (_hoverEventCallback != null)
+            {
+                this.HoveredSignal().Disconnect(_hoverEventCallback);
+            }
+
+            if (_touchDataCallback != null)
+            {
+                this.TouchSignal().Disconnect(_touchDataCallback);
+            }
+
+            if (_ResourcesLoadedCallback != null)
+            {
+                this.ResourcesLoadedSignal().Disconnect(_ResourcesLoadedCallback);
+            }
+
+            if (_offWindowEventCallback != null)
+            {
+                this.OffWindowSignal().Disconnect(_offWindowEventCallback);
+            }
+
+            if (_onWindowEventCallback != null)
+            {
+                this.OnWindowSignal().Disconnect(_onWindowEventCallback);
+            }
+
+            if (_wheelEventCallback != null)
+            {
+                this.WheelEventSignal().Disconnect(_wheelEventCallback);
+            }
+
+            if (_hoverEventCallback != null)
+            {
+                this.HoveredSignal().Disconnect(_hoverEventCallback);
+            }
+
+            if (_touchDataCallback != null)
+            {
+                this.TouchSignal().Disconnect(_touchDataCallback);
+            }
+
+            if (_onRelayoutEventCallback != null)
+            {
+                this.OnRelayoutSignal().Disconnect(_onRelayoutEventCallback);
+            }
+
+            if (_keyCallback != null)
+            {
+                this.KeyEventSignal().Disconnect(_keyCallback);
+            }
+
+            if (_keyInputFocusLostCallback != null)
+            {
+                this.KeyInputFocusLostSignal().Disconnect(_keyInputFocusLostCallback);
+            }
+
+            if (_keyInputFocusGainedCallback != null)
+            {
+                this.KeyInputFocusGainedSignal().Disconnect(_keyInputFocusGainedCallback);
+            }
+
+            // BaseHandle CPtr is used in Registry and there is danger of deletion if we keep using it here.
+            // Restore current CPtr.
+            swigCPtr = currentCPtr;
+        }
+
         private EventHandler _keyInputFocusGainedEventHandler;
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
         private delegate void KeyInputFocusGainedCallbackType(IntPtr control);
@@ -850,9 +1025,10 @@ namespace Tizen.NUI.BaseComponents
         {
             View view = null;
 
-            if (Parent)
+            if (Parent is View)
             {
-                view = Parent.FindChildById(id);
+                View parentView = Parent as View;
+                view = parentView.FindChildById(id);
             }
 
             if (!view)
@@ -1699,17 +1875,6 @@ namespace Tizen.NUI.BaseComponents
             }
         }
 
-        /// <summary>
-        /// Retrieves the view's parent.<br>
-        /// </summary>
-        public View Parent
-        {
-            get
-            {
-                return GetParent();
-            }
-        }
-
         [Obsolete("Please do not use! this will be deprecated. Please use Visibility instead.")]
         public bool Visible
         {
@@ -2055,32 +2220,6 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Adds a child view to this View.
-        /// </summary>
-        /// <pre>This View(the parent) has been initialized. The child view has been initialized. The child view is not the same as the parent view.</pre>
-        /// <post>The child will be referenced by its parent. This means that the child will be kept alive, even if the handle passed into this method is reset or destroyed.</post>
-        /// <remarks>If the child already has a parent, it will be removed from old parent and reparented to this view. This may change child's position, color, scale etc as it now inherits them from this view.</remarks>
-        /// <param name="child">The child</param>
-        public void Add(View child)
-        {
-            NDalicPINVOKE.Actor_Add(swigCPtr, View.getCPtr(child));
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-        }
-
-        /// <summary>
-        /// Removes a child View from this View. If the view was not a child of this view, this is a no-op.
-        /// </summary>
-        /// <pre>This View(the parent) has been initialized. The child view is not the same as the parent view.</pre>
-        /// <param name="child">The child</param>
-        public void Remove(View child)
-        {
-            NDalicPINVOKE.Actor_Remove(swigCPtr, View.getCPtr(child));
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-        }
-
-        /// <summary>
         /// Removes a View from its Parent View / Layer. If the View has no parent, this method does nothing.
         /// </summary>
         /// <pre>The (child) View has been initialized. </pre>
@@ -2092,36 +2231,6 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Retrieves the number of children held by the view.
-        /// </summary>
-        /// <pre>The View has been initialized.</pre>
-        /// <returns>The number of children</returns>
-        internal uint GetChildCount()
-        {
-            uint ret = NDalicPINVOKE.Actor_GetChildCount(swigCPtr);
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            return ret;
-        }
-
-        /// <summary>
-        /// Retrieves child view by index.
-        /// </summary>
-        /// <pre>The View has been initialized.</pre>
-        /// <param name="index">The index of the child to retrieve</param>
-        /// <returns>The view for the given index or empty handle if children not initialized</returns>
-        public View GetChildAt(uint index)
-        {
-            IntPtr cPtr = NDalicPINVOKE.Actor_GetChildAt(swigCPtr, index);
-
-            View ret = Registry.GetManagedBaseHandleFromNativePtr(cPtr) as View;
-
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            return ret ?? null;
-        }
-
-        /// <summary>
         /// Search through this view's hierarchy for an view with the given name.
         /// The view itself is also considered in the search.
         /// </summary>
@@ -2150,47 +2259,6 @@ namespace Tizen.NUI.BaseComponents
             return ret;
         }
 
-        /*internal View GetParent()
-        {
-            View ret;
-            IntPtr cPtr = NDalicPINVOKE.Actor_GetParent(swigCPtr);
-
-            BaseHandle basehandle = Registry.GetManagedBaseHandleFromNativePtr(cPtr);
-
-            if(basehandle is Layer)
-            {
-                ret = new View(cPtr,false);
-            }
-            else
-            {
-                ret = basehandle as View;
-            }
-
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            return ret;
-        }*/
-
-        internal View GetParent()
-        {
-            View ret;
-            IntPtr cPtr = NDalicPINVOKE.Actor_GetParent(swigCPtr);
-
-            BaseHandle basehandle = Registry.GetManagedBaseHandleFromNativePtr(cPtr);
-
-            if(basehandle is Layer)
-            {
-                View ret2 = new View(cPtr,false);
-                return ret2;
-            }
-
-            ret = basehandle as View;
-
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-            return ret;
-        }
-
         internal void SetParentOrigin(Vector3 origin)
         {
             NDalicPINVOKE.Actor_SetParentOrigin(swigCPtr, Vector3.getCPtr(origin));
@@ -3893,6 +3961,32 @@ namespace Tizen.NUI.BaseComponents
             }
         }
 
+        [Obsolete("Please DO NOT use! This will be deprecated! Please use 'Container GetParent()' instead!")]
+        public View Parent
+        {
+            get
+            {
+                View ret;
+                IntPtr cPtr = NDalicPINVOKE.Actor_GetParent(swigCPtr);
+
+                BaseHandle basehandle = Registry.GetManagedBaseHandleFromNativePtr(cPtr);
+
+                if (basehandle is Layer)
+                {
+                    ret = new View(cPtr, false);
+                }
+                else
+                {
+                    ret = basehandle as View;
+                }
+
+                if (NDalicPINVOKE.SWIGPendingException.Pending)
+                    throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+                return ret;
+            }
+        }
+
+
 
 
 
index dc36895..d33ce5d 100755 (executable)
@@ -57,7 +57,7 @@ namespace Tizen.NUI.BaseComponents
             CustomViewRegistry.Instance.Register(CreateInstance, typeof(VisualView));
         }
 
-        public VisualView() : base(typeof(VisualView).Name, CustomViewBehaviour.ViewBehaviourDefault)
+        public VisualView() : base(typeof(VisualView).FullName, CustomViewBehaviour.ViewBehaviourDefault)
         {
         }
 
index c692895..40ed2a1 100755 (executable)
@@ -25,12 +25,16 @@ namespace Tizen.NUI
 
         internal BaseHandle(global::System.IntPtr cPtr, bool cMemoryOwn)
         {
+            //to catch derived classes dali native exceptions
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+
             _registerMe = swigCMemOwn = cMemoryOwn;
 
             swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
 
             // using copy constructor to create another native handle so Registry.Unregister works fine.
             swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, NDalicPINVOKE.new_BaseHandle__SWIG_2(swigCPtr));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
 
             if (_registerMe)
             {
@@ -47,6 +51,7 @@ namespace Tizen.NUI
 
             // using copy constructor to create another native handle so Registry.Unregister works fine.
             swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, NDalicPINVOKE.new_BaseHandle__SWIG_2(swigCPtr));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
 
             if (_registerMe)
             {
@@ -337,6 +342,14 @@ namespace Tizen.NUI
             return ret;
         }
 
+        internal global::System.Runtime.InteropServices.HandleRef GetBaseHandleCPtrHandleRef
+        {
+            get
+            {
+                return swigCPtr;
+            }
+        }
+
     }
 
 }
diff --git a/src/Tizen.NUI/src/public/Container.cs b/src/Tizen.NUI/src/public/Container.cs
new file mode 100755 (executable)
index 0000000..515874e
--- /dev/null
@@ -0,0 +1,114 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+using System;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI
+{
+    /// <summary>
+    ///
+    /// Container is an abstract class to be inherited from by classes that desire to have Views
+    /// added to them.
+    ///
+    /// </summary>
+
+    public abstract class Container : Animatable
+    {
+
+        internal Container(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn)
+        {
+            // No un-managed data hence no need to store a native ptr
+        }
+
+        protected override void Dispose(DisposeTypes type)
+        {
+            if (disposed)
+            {
+                return;
+            }
+
+            base.Dispose(type);
+        }
+
+
+        /// <summary>
+        /// Adds a child view to this Container.
+        /// </summary>
+        /// <pre>This Container(the parent) has been initialized. The child view has been initialized. The child view is not the same as the parent view.</pre>
+        /// <post>The child will be referenced by its parent. This means that the child will be kept alive, even if the handle passed into this method is reset or destroyed.</post>
+        /// <remarks>If the child already has a parent, it will be removed from old parent and reparented to this view. This may change child's position, color, scale etc as it now inherits them from this view.</remarks>
+        /// <param name="view">The child view to add</param>
+        public abstract void Add( View view );
+
+        /// <summary>
+        /// Removes a child View from this View. If the view was not a child of this view, this is a no-op.
+        /// </summary>
+        /// <pre>This View(the parent) has been initialized. The child view is not the same as the parent view.</pre>
+        /// <param name="child">The child</param>
+        public abstract void Remove( View view );
+
+        /// <summary>
+        /// Retrieves child view by index.
+        /// </summary>
+        /// <pre>The View has been initialized.</pre>
+        /// <param name="index">The index of the child to retrieve</param>
+        /// <returns>The view for the given index or empty handle if children not initialized</returns>
+        public abstract View GetChildAt( uint index );
+
+        /// <summary>
+        /// Get the parent of this container
+        /// </summary>
+        /// <pre>The child container has been initialized.</pre>
+        /// <returns>The parent container</returns>
+        protected abstract Container GetParent();
+
+        /// <summary>
+        /// Get the number of children for this container
+        /// </summary>
+        /// <pre>The container has been initialized.</pre>
+        /// <returns>number of children</returns>
+        protected abstract UInt32 GetChildCount();
+
+        /// <summary>
+        /// Get the parent Container
+        /// Read only
+        /// </summary>
+        /// <pre>The child container has been initialized.</pre>
+        /// <returns>The parent container</returns>
+        public Container Parent
+        {
+            get
+            {
+                return GetParent();
+            }
+        }
+
+        /// <summary>
+        /// Get the number of children for this container
+        /// Read only
+        /// </summary>
+        /// <pre>The container has been initialized.</pre>
+        /// <returns>number of children</returns>
+        public uint ChildCount
+        {
+            get
+            {
+                return GetChildCount();
+            }
+        }
+    }
+} // namespace Tizen.NUI
\ No newline at end of file
index c528820..ac1aaff 100755 (executable)
@@ -65,6 +65,31 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_focusedViewEnterKeyEventCallback2 != null)
+            {
+                FocusedViewEnterKeySignal().Disconnect(_focusedViewEnterKeyEventCallback2);
+            }
+
+            if (_focusedViewEnterKeyEventCallback != null)
+            {
+                FocusedViewEnterKeySignal().Disconnect(_focusedViewEnterKeyEventCallback);
+            }
+
+            if (_focusGroupChangedEventCallback != null)
+            {
+                FocusGroupChangedSignal().Disconnect(_focusGroupChangedEventCallback);
+            }
+
+            if (_focusChangedEventCallback != null)
+            {
+                FocusChangedSignal().Disconnect(_focusChangedEventCallback);
+            }
+
+            if (_preFocusChangeCallback != null)
+            {
+                PreFocusChangeSignal().Disconnect(_preFocusChangeCallback);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
@@ -403,7 +428,7 @@ namespace Tizen.NUI
             {
                 _focusedViewEnterKeyEventHandler -= value;
 
-                if (_focusedViewEnterKeyEventCallback == null && FocusedViewEnterKeySignal().Empty() == false)
+                if (_focusedViewEnterKeyEventCallback != null && FocusedViewEnterKeySignal().Empty() == false)
                 {
                     FocusedViewEnterKeySignal().Disconnect(_focusedViewEnterKeyEventCallback);
                 }
@@ -729,7 +754,7 @@ namespace Tizen.NUI
             {
                 _focusedViewEnterKeyEventHandler2 -= value;
 
-                if (_focusedViewEnterKeyEventCallback2 == null && FocusedViewEnterKeySignal().Empty() == false)
+                if (_focusedViewEnterKeyEventCallback2 != null && FocusedViewEnterKeySignal().Empty() == false)
                 {
                     FocusedViewEnterKeySignal().Disconnect(_focusedViewEnterKeyEventCallback2);
                 }
index 16f5728..946f353 100755 (executable)
@@ -54,7 +54,37 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
-            if (swigCPtr.Handle != IntPtr.Zero)
+            if (_keyboardTypeChangedEventCallback != null)
+            {
+                KeyboardTypeChangedSignal().Disconnect(_keyboardTypeChangedEventCallback);
+            }
+
+            if (_imfManagerLanguageChangedEventCallback != null)
+            {
+                LanguageChangedSignal().Disconnect(_imfManagerLanguageChangedEventCallback);
+            }
+
+            if (_imfManagerResizedEventCallback != null)
+            {
+                ResizedSignal().Disconnect(_imfManagerResizedEventCallback);
+            }
+
+            if (_imfManagerStatusChangedEventCallback != null)
+            {
+                StatusChangedSignal().Disconnect(_imfManagerStatusChangedEventCallback);
+            }
+
+            if (_imfManagerEventReceivedEventCallback != null)
+            {
+                EventReceivedSignal().Disconnect(_imfManagerEventReceivedEventCallback);
+            }
+
+            if (_imfManagerActivatedEventCallback != null)
+            {
+                ActivatedSignal().Disconnect(_imfManagerActivatedEventCallback);
+            }
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
                 {
index 17179f8..f4aaa35 100755 (executable)
@@ -22,7 +22,7 @@ namespace Tizen.NUI
     /// <summary>
     /// Layers provide a mechanism for overlaying groups of actors on top of each other.
     /// </summary>
-    public class Layer : Animatable
+    public class Layer : Container
     {
         private global::System.Runtime.InteropServices.HandleRef swigCPtr;
 
@@ -36,6 +36,64 @@ namespace Tizen.NUI
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
         }
 
+        /// from Container base class
+
+        /// <summary>
+        /// Adds a child view to this layer.
+        /// </summary>
+        /// <seealso cref="Container::Add()">
+        /// </seealso>
+        public override void Add(View child)
+        {
+            NDalicPINVOKE.Actor_Add(swigCPtr, View.getCPtr(child));
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Removes a child View from this layer. If the view was not a child of this layer, this is a no-op.
+        /// </summary>
+        /// <seealso cref="Container::Add()">
+        /// </seealso>
+        public override void Remove(View child)
+        {
+            NDalicPINVOKE.Actor_Remove(swigCPtr, View.getCPtr(child));
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Retrieves child view by index.
+        /// </summary>
+        /// <pre>The View has been initialized.</pre>
+        /// <param name="index">The index of the child to retrieve</param>
+        /// <returns>The view for the given index or empty handle if children not initialized</returns>
+        public override View GetChildAt(uint index)
+        {
+            System.IntPtr cPtr = NDalicPINVOKE.Actor_GetChildAt(swigCPtr, index);
+
+            View ret = Registry.GetManagedBaseHandleFromNativePtr(cPtr) as View;
+
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+
+            return ret ?? null;
+        }
+
+
+        protected override Container GetParent()
+        {
+            return null;
+        }
+
+        protected override uint GetChildCount()
+        {
+            uint ret = NDalicPINVOKE.Actor_GetChildCount(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
         protected override void Dispose(DisposeTypes type)
         {
             if(disposed)
@@ -126,32 +184,6 @@ namespace Tizen.NUI
         }
 
         /// <summary>
-        /// Adds a child view to this layer.
-        /// </summary>
-        /// <pre>This layer(the parent) has been initialized. The child view has been initialized. The child view is not the same as the parent layer.</pre>
-        /// <post>The child will be referenced by its parent. This means that the child will be kept alive, even if the handle passed into this method is reset or destroyed.</post>
-        /// <remarks>If the child already has a parent, it will be removed from old parent and reparented to this layer. This may change child's position, color, scale etc as it now inherits them from this layer.</remarks>
-        /// <param name="child">The child</param>
-        public void Add(View child)
-        {
-            NDalicPINVOKE.Actor_Add(swigCPtr, View.getCPtr(child));
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-        }
-
-        /// <summary>
-        /// Removes a child View from this layer. If the view was not a child of this layer, this is a no-op.
-        /// </summary>
-        /// <pre>This layer(the parent) has been initialized. The child view is not the same as the parent view.</pre>
-        /// <param name="child">The child</param>
-        public void Remove(View child)
-        {
-            NDalicPINVOKE.Actor_Remove(swigCPtr, View.getCPtr(child));
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-        }
-
-        /// <summary>
         /// Queries the depth of the layer.<br>
         /// 0 is the bottom most layer, higher number is on top.<br>
         /// </summary>
@@ -286,24 +318,6 @@ namespace Tizen.NUI
         }
 
         /// <summary>
-        /// Retrieves child view by index.
-        /// </summary>
-        /// <pre>The View has been initialized.</pre>
-        /// <param name="index">The index of the child to retrieve</param>
-        /// <returns>The view for the given index or empty handle if children not initialized</returns>
-        public View GetChildAt(uint index)
-        {
-            System.IntPtr cPtr = NDalicPINVOKE.Actor_GetChildAt(swigCPtr, index);
-
-            View ret = Registry.GetManagedBaseHandleFromNativePtr(cPtr) as View;
-
-            if (NDalicPINVOKE.SWIGPendingException.Pending)
-                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
-
-            return ret ?? null;
-        }
-
-        /// <summary>
         /// Enumeration for the behavior of the layer.
         /// </summary>
         public enum LayerBehavior
@@ -459,5 +473,6 @@ namespace Tizen.NUI
             if (NDalicPINVOKE.SWIGPendingException.Pending)
                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
+
     }
 }
index 32f9950..77639e8 100755 (executable)
@@ -182,6 +182,16 @@ namespace Tizen.NUI
         }
 
         /// <summary>
+        /// Ensures that the function passed in is called from the main loop when it is idle.
+        /// </summary>
+        /// <param name="func">The function to call</param>
+        /// <returns>true if added successfully, false otherwise</returns>
+        public bool AddIdle(System.Delegate func)
+        {
+            return ((NUICoreBackend)this.Backend).AddIdle(func);
+        }
+
+        /// <summary>
         /// Enumeration for deciding whether a NUI application window is opaque or transparent.
         /// </summary>
         public enum WindowMode
diff --git a/src/Tizen.NUI/src/public/NUIWidgetApplication.cs b/src/Tizen.NUI/src/public/NUIWidgetApplication.cs
new file mode 100755 (executable)
index 0000000..c0de24c
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using Tizen.Applications;
+using Tizen.Applications.CoreBackend;
+using Tizen.NUI;
+
+namespace Tizen.NUI
+{
+
+    /// <summary>
+    /// Represents an application that have UI screen. The NUIWidgetApplication class has a default stage.
+    /// </summary>
+    public class NUIWidgetApplication : CoreApplication
+    {
+
+        /// <summary>
+        /// The default constructor.
+        /// </summary>
+        public NUIWidgetApplication() : base(new NUIWidgetCoreBackend())
+        {
+            Tizen.Log.Fatal("NUI", "### NUIWidgetApplication called");
+        }
+
+        /// <summary>
+        /// The constructor with stylesheet.
+        /// </summary>
+        public NUIWidgetApplication(string stylesheet) : base(new NUIWidgetCoreBackend(stylesheet))
+        {
+            Tizen.Log.Fatal("NUI", "### NUIWidgetApplication(string) called");
+        }
+
+        /// <summary>
+        /// Overrides this method if want to handle behavior.
+        /// </summary>
+        protected override void OnLocaleChanged(LocaleChangedEventArgs e)
+        {
+            Log.Fatal("NUI", "OnLocaleChanged() is called!");
+            base.OnLocaleChanged(e);
+        }
+
+        /// <summary>
+        /// Overrides this method if want to handle behavior.
+        /// </summary>
+        protected override void OnLowBattery(LowBatteryEventArgs e)
+        {
+            Log.Fatal("NUI", "OnLowBattery() is called!");
+            base.OnLowBattery(e);
+        }
+
+        /// <summary>
+        /// Overrides this method if want to handle behavior.
+        /// </summary>
+        protected override void OnLowMemory(LowMemoryEventArgs e)
+        {
+            Log.Fatal("NUI", "OnLowMemory() is called!");
+            base.OnLowMemory(e);
+        }
+
+        /// <summary>
+        /// Overrides this method if want to handle behavior.
+        /// </summary>
+        protected override void OnRegionFormatChanged(RegionFormatChangedEventArgs e)
+        {
+            Log.Fatal("NUI", "OnRegionFormatChanged() is called!");
+            base.OnRegionFormatChanged(e);
+        }
+
+        /// <summary>
+        /// Overrides this method if want to handle behavior.
+        /// </summary>
+        protected override void OnTerminate()
+        {
+            Log.Fatal("NUI", "OnTerminate() is called!");
+            base.OnTerminate();
+        }
+
+        /// <summary>
+        /// Overrides this method if want to handle behavior.
+        /// </summary>
+        protected virtual void OnPreCreate()
+        {
+            Log.Fatal("NUI", "OnPreCreate() is called!");
+        }
+
+        /// <summary>
+        /// Overrides this method if want to handle behavior.
+        /// </summary>
+        protected override void OnCreate()
+        {
+            // This is also required to create DisposeQueue on main thread.
+            DisposeQueue disposeQ = DisposeQueue.Instance;
+            disposeQ.Initialize();
+            Log.Fatal("NUI","OnCreate() is called!");
+            base.OnCreate();
+        }
+
+        /// <summary>
+        /// Run NUIWidgetApplication.
+        /// </summary>
+        /// <param name="args">Arguments from commandline.</param>
+        public override void Run(string[] args)
+        {
+            Backend.AddEventHandler(EventType.PreCreated, OnPreCreate);
+            base.Run(args);
+        }
+
+        /// <summary>
+        /// Exit NUIWidgetApplication.
+        /// </summary>
+        public override void Exit()
+        {
+            Tizen.Log.Fatal("NUI", "### NUIWidgetApplication Exit called");
+            base.Exit();
+        }
+
+        internal WidgetApplication ApplicationHandle
+        {
+            get
+            {
+                return ((NUIWidgetCoreBackend)this.Backend).WidgetApplicationHandle;
+            }
+        }
+
+        /// <summary>
+        /// Get the window instance.
+        /// </summary>
+        public Window Window
+        {
+            get
+            {
+                //return Window.Instance;
+                return ApplicationHandle.GetWindow();
+            }
+        }
+    }
+}
index 960b5f4..d579034 100755 (executable)
@@ -63,6 +63,11 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_styleManagerStyleChangedCallbackDelegate != null)
+            {
+                StyleChangedSignal().Disconnect(_styleManagerStyleChangedCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index ec2b788..415606b 100755 (executable)
@@ -54,6 +54,11 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_stateChangedEventCallback != null)
+            {
+                StateChangedSignal().Disconnect(_stateChangedEventCallback);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index 41c9b7a..f873d6e 100755 (executable)
@@ -62,6 +62,11 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_timerTickCallbackDelegate != null)
+            {
+                TickSignal().Disconnect(_timerTickCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index a67858d..43eb91a 100755 (executable)
@@ -72,6 +72,8 @@ namespace Tizen.NUI.UIComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            DisConnectFromSignals();
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
@@ -85,6 +87,39 @@ namespace Tizen.NUI.UIComponents
             base.Dispose(type);
         }
 
+        private void DisConnectFromSignals()
+        {
+            // Save current CPtr.
+            global::System.Runtime.InteropServices.HandleRef currentCPtr = swigCPtr;
+
+            // Use BaseHandle CPtr as current might have been deleted already in derived classes.
+            swigCPtr = GetBaseHandleCPtrHandleRef;
+
+            if (_stateChangedCallback != null)
+            {
+                StateChangedSignal().Disconnect(_stateChangedCallback);
+            }
+
+            if (_releasedCallback != null)
+            {
+                ReleasedSignal().Disconnect(_releasedCallback);
+            }
+
+            if (_pressedCallback != null)
+            {
+                this.PressedSignal().Disconnect(_pressedCallback);
+            }
+
+            if (_clickedCallback != null)
+            {
+                ClickedSignal().Disconnect(_clickedCallback);
+            }
+
+            // BaseHandle CPtr is used in Registry and there is danger of deletion if we keep using it here.
+            // Restore current CPtr.
+            swigCPtr = currentCPtr;
+        }
+
 
         private EventHandlerWithReturnType<object, EventArgs, bool> _clickedEventHandler;
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
index 24a606d..a39f012 100755 (executable)
@@ -58,6 +58,31 @@ namespace Tizen.NUI.UIComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_popUpHiddenEventCallbackDelegate != null)
+            {
+                HiddenSignal().Disconnect(_popUpHiddenEventCallbackDelegate);
+            }
+
+            if (_popUpHidingEventCallbackDelegate != null)
+            {
+                HidingSignal().Disconnect(_popUpHidingEventCallbackDelegate);
+            }
+
+            if (_popUpShownEventCallbackDelegate != null)
+            {
+                ShownSignal().Disconnect(_popUpShownEventCallbackDelegate);
+            }
+
+            if (_popUpShowingEventCallbackDelegate != null)
+            {
+                ShowingSignal().Disconnect(_popUpShowingEventCallbackDelegate);
+            }
+
+            if (_popUpOutsideTouchedEventCallbackDelegate != null)
+            {
+                this.OutsideTouchedSignal().Disconnect(_popUpOutsideTouchedEventCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index 978e777..a6bde47 100755 (executable)
@@ -60,6 +60,11 @@ namespace Tizen.NUI.UIComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_progressBarValueChangedCallbackDelegate != null)
+            {
+                ValueChangedSignal().Disconnect(_progressBarValueChangedCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index 51417f2..9a9a5ad 100755 (executable)
@@ -60,6 +60,16 @@ namespace Tizen.NUI.UIComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_scrollBarScrollPositionIntervalReachedEventCallbackDelegate != null)
+            {
+                ScrollPositionIntervalReachedSignal().Disconnect(_scrollBarScrollPositionIntervalReachedEventCallbackDelegate);
+            }
+
+            if (_scrollBarPanFinishedEventCallbackDelegate != null)
+            {
+                PanFinishedSignal().Disconnect(_scrollBarPanFinishedEventCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index b9bb7ea..67f307f 100755 (executable)
@@ -54,6 +54,11 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_scrollViewSnapStartedCallbackDelegate != null)
+            {
+                this.SnapStartedSignal().Disconnect(_scrollViewSnapStartedCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index a7d6882..3bb0e12 100755 (executable)
@@ -60,6 +60,21 @@ namespace Tizen.NUI.UIComponents
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_sliderValueChangedCallbackDelegate != null)
+            {
+                ValueChangedSignal().Disconnect(_sliderValueChangedCallbackDelegate);
+            }
+
+            if (_sliderSlidingFinishedCallbackDelegate != null)
+            {
+                SlidingFinishedSignal().Disconnect(_sliderSlidingFinishedCallbackDelegate);
+            }
+
+            if (_sliderMarkReachedCallbackDelegate != null)
+            {
+                MarkReachedSignal().Disconnect(_sliderMarkReachedCallbackDelegate);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
index 01098c3..1c0584d 100755 (executable)
@@ -74,7 +74,7 @@ namespace Tizen.NUI
                 _visualSize = value;
                 if (_visualSizePolicy == null)
                 {
-                    _visualSizePolicy = new Vector2(0.0f, 0.0f);
+                    _visualSizePolicy = new Vector2(1.0f, 1.0f);
                 }
                 UpdateVisual();
             }
@@ -97,7 +97,7 @@ namespace Tizen.NUI
                 _visualOffset = value;
                 if (_visualOffsetPolicy == null)
                 {
-                    _visualOffsetPolicy = new Vector2(0.0f, 0.0f);
+                    _visualOffsetPolicy = new Vector2(1.0f, 1.0f);
                 }
                 UpdateVisual();
             }
diff --git a/src/Tizen.NUI/src/public/Widget.cs b/src/Tizen.NUI/src/public/Widget.cs
new file mode 100755 (executable)
index 0000000..098e5ab
--- /dev/null
@@ -0,0 +1,620 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+using System;
+using System.Runtime.InteropServices;
+using Tizen.Applications;
+
+namespace Tizen.NUI
+{
+    /// <summary>
+    /// Widget object should be created by WidgetApplication.
+    /// </summary>
+    public class Widget : BaseHandle
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+
+        internal Widget(global::System.IntPtr cPtr, bool cMemoryOwn) : base(NDalicManualPINVOKE.Widget_SWIGUpcast(cPtr), cMemoryOwn)
+        {
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Widget obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        /// <summary>
+        /// To make Widget instance be disposed.
+        /// </summary>
+        protected override void Dispose(DisposeTypes type)
+        {
+            if(disposed)
+            {
+                return;
+            }
+
+            if(type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                if (swigCMemOwn)
+                {
+                    swigCMemOwn = false;
+                    NDalicManualPINVOKE.delete_Widget(swigCPtr);
+                }
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            base.Dispose(type);
+        }
+
+        /// <summary>
+        /// This is the constructor for Widget.
+        /// </summary>
+        /// <param name="id">for widget instance</param>
+        public Widget(string id) : this(NDalicManualPINVOKE.Widget_New(id), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        internal Widget(Widget widget) : this(NDalicManualPINVOKE.new_Widget__SWIG_1(Widget.getCPtr(widget)), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        internal Widget Assign(Widget widget)
+        {
+            Widget ret = new Widget(NDalicManualPINVOKE.Widget_Assign(swigCPtr, Widget.getCPtr(widget)), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Event arguments that passed via KeyEvent signal.
+        /// </summary>
+        public class CreateEventArgs : EventArgs
+        {
+            /// <summary>
+            /// widget data.
+            /// </summary>
+            public WidgetData WidgetData
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// a bundle.
+            /// </summary>
+            public SWIGTYPE_p_bundle Bundle
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// window size.
+            /// </summary>
+            public Size2D WindowSize
+            {
+                get;
+                set;
+            }
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void CreateCallbackType(IntPtr widgetData, IntPtr bundle, IntPtr windowSize);
+        private CreateCallbackType _createCallback;
+        private EventHandler<CreateEventArgs> _createEventHandler;
+
+        /// <summary>
+        /// Create event.
+        /// </summary>
+        public event EventHandler<CreateEventArgs> Create
+        {
+            add
+            {
+                if (_createEventHandler == null)
+                {
+                    _createCallback = OnCreate;
+                    CreateSignal().Connect(_createCallback);
+                }
+
+                _createEventHandler += value;
+            }
+
+            remove
+            {
+                _createEventHandler -= value;
+
+                if (_createEventHandler == null && CreateSignal().Empty() == false)
+                {
+                   CreateSignal().Disconnect(_createCallback);
+                }
+            }
+        }
+
+        private void OnCreate(IntPtr widgetData, IntPtr bundle, IntPtr windowSize)
+        {
+            CreateEventArgs e = new CreateEventArgs();
+            if (widgetData != null)
+            {
+                e.WidgetData = WidgetData.GetWidgetDataFromPtr(widgetData);
+            }
+            if (bundle != null)
+            {
+                e.Bundle = new SWIGTYPE_p_bundle(bundle, false);
+            }
+            if (windowSize != null)
+            {
+                var val = new Uint16Pair(windowSize, false);
+                e.WindowSize = val;
+                val.Dispose();
+            }
+
+            _createEventHandler?.Invoke(this, e);
+        }
+
+        internal WidgetInstanceCreateSignalType CreateSignal()
+        {
+            WidgetInstanceCreateSignalType ret = new WidgetInstanceCreateSignalType(NDalicManualPINVOKE.Widget_CreateSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Event arguments that passed via terminate event signal.
+        /// </summary>
+        public class TerminateEventArgs : EventArgs
+        {
+            /// <summary>
+            /// widget data.
+            /// </summary>
+            public WidgetData WidgetData
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// a bundle.
+            /// </summary>
+            public SWIGTYPE_p_bundle Bundle
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// widget terminate type.
+            /// </summary>
+            public WidgetTerminateType WidgetTerminateType
+            {
+                get;
+                set;
+            }
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void TerminateCallbackType(IntPtr widgetData, IntPtr bundle, WidgetTerminateType widgetTerminateType);
+        private TerminateCallbackType _terminateCallback;
+        private EventHandler<TerminateEventArgs> _terminateEventHandler;
+
+        /// <summary>
+        /// Terminate event.
+        /// </summary>
+        public event EventHandler<TerminateEventArgs> Terminate
+        {
+            add
+            {
+                if (_terminateEventHandler == null)
+                {
+                    _terminateCallback = OnTerminate;
+                    TerminateSignal().Connect(_terminateCallback);
+                }
+
+                _terminateEventHandler += value;
+            }
+
+            remove
+            {
+                _terminateEventHandler -= value;
+
+                if (_terminateEventHandler == null && TerminateSignal().Empty() == false)
+                {
+                   TerminateSignal().Disconnect(_terminateCallback);
+                }
+            }
+        }
+
+        private void OnTerminate(IntPtr widgetData, IntPtr bundle, WidgetTerminateType widgetTerminateType)
+        {
+            TerminateEventArgs e = new TerminateEventArgs();
+            if (widgetData != null)
+            {
+                e.WidgetData = WidgetData.GetWidgetDataFromPtr(widgetData);
+            }
+            if (bundle != null)
+            {
+                e.Bundle = new SWIGTYPE_p_bundle(bundle, false);
+            }
+
+            e.WidgetTerminateType = widgetTerminateType;
+            _terminateEventHandler?.Invoke(this, e);
+        }
+
+        internal WidgetInstanceTerminateSignalType TerminateSignal()
+        {
+            WidgetInstanceTerminateSignalType ret = new WidgetInstanceTerminateSignalType(NDalicManualPINVOKE.Widget_TerminateSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Event arguments that passed via pause event signal.
+        /// </summary>
+        public class PauseEventArgs : EventArgs
+        {
+            /// <summary>
+            /// widget data.
+            /// </summary>
+            public WidgetData WidgetData
+            {
+                get;
+                set;
+            }
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void PauseCallbackType(IntPtr widgetData);
+        private PauseCallbackType _pauseCallback;
+        private EventHandler<PauseEventArgs> _pauseEventHandler;
+
+        /// <summary>
+        /// Pause event.
+        /// </summary>
+        public event EventHandler<PauseEventArgs> Pause
+        {
+            add
+            {
+                if (_pauseEventHandler == null)
+                {
+                    _pauseCallback = OnPause;
+                    PauseSignal().Connect(_pauseCallback);
+                }
+
+                _pauseEventHandler += value;
+            }
+
+            remove
+            {
+                _pauseEventHandler -= value;
+
+                if (_pauseEventHandler == null && PauseSignal().Empty() == false)
+                {
+                   PauseSignal().Disconnect(_pauseCallback);
+                }
+            }
+        }
+
+        private void OnPause(IntPtr widgetData)
+        {
+            PauseEventArgs e = new PauseEventArgs();
+            if (widgetData != null)
+            {
+                e.WidgetData = WidgetData.GetWidgetDataFromPtr(widgetData);
+            }
+
+            _pauseEventHandler?.Invoke(this, e);
+        }
+
+        internal WidgetInstancePauseOrResumeSignalType PauseSignal()
+        {
+            WidgetInstancePauseOrResumeSignalType ret = new WidgetInstancePauseOrResumeSignalType(NDalicManualPINVOKE.Widget_PauseSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Event arguments that passed via pause event signal.
+        /// </summary>
+        public class ResumeEventArgs : EventArgs
+        {
+            /// <summary>
+            /// widget data.
+            /// </summary>
+            public WidgetData WidgetData
+            {
+                get;
+                set;
+            }
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void ResumeCallbackType(IntPtr widgetData);
+        private ResumeCallbackType _resumeCallback;
+        private EventHandler<ResumeEventArgs> _resumeEventHandler;
+
+        /// <summary>
+        /// Resume event.
+        /// </summary>
+        public event EventHandler<ResumeEventArgs> Resume
+        {
+            add
+            {
+                if (_resumeEventHandler == null)
+                {
+                    _resumeCallback = OnResume;
+                    ResumeSignal().Connect(_resumeCallback);
+                }
+
+                _resumeEventHandler += value;
+            }
+
+            remove
+            {
+                _resumeEventHandler -= value;
+
+                if (_resumeEventHandler == null && ResumeSignal().Empty() == false)
+                {
+                   ResumeSignal().Disconnect(_resumeCallback);
+                }
+            }
+        }
+
+        private void OnResume(IntPtr widgetData)
+        {
+            ResumeEventArgs e = new ResumeEventArgs();
+            if (widgetData != null)
+            {
+                e.WidgetData = WidgetData.GetWidgetDataFromPtr(widgetData);
+            }
+
+            _resumeEventHandler?.Invoke(this, e);
+        }
+
+        internal WidgetInstancePauseOrResumeSignalType ResumeSignal()
+        {
+            WidgetInstancePauseOrResumeSignalType ret = new WidgetInstancePauseOrResumeSignalType(NDalicManualPINVOKE.Widget_ResumeSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Event arguments that passed via resize signal.
+        /// </summary>
+        public class ResizeEventArgs : EventArgs
+        {
+            /// <summary>
+            /// widget data.
+            /// </summary>
+            public WidgetData WidgetData
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// window size.
+            /// </summary>
+            public Size2D WindowSize
+            {
+                get;
+                set;
+            }
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void ResizeCallbackType(IntPtr widgetData, IntPtr windowSize);
+        private ResizeCallbackType _resizeCallback;
+        private EventHandler<ResizeEventArgs> _resizeEventHandler;
+
+        /// <summary>
+        /// Resize event.
+        /// </summary>
+        public event EventHandler<ResizeEventArgs> Resize
+        {
+            add
+            {
+                if (_resizeEventHandler == null)
+                {
+                    _resizeCallback = OnResize;
+                    ResizeSignal().Connect(_resizeCallback);
+                }
+
+                _resizeEventHandler += value;
+            }
+
+            remove
+            {
+                _resizeEventHandler -= value;
+
+                if (_resizeEventHandler == null && ResizeSignal().Empty() == false)
+                {
+                   ResizeSignal().Disconnect(_resizeCallback);
+                }
+            }
+        }
+
+        private void OnResize(IntPtr widgetData, IntPtr windowSize)
+        {
+            ResizeEventArgs e = new ResizeEventArgs();
+            if (widgetData != null)
+            {
+                e.WidgetData = WidgetData.GetWidgetDataFromPtr(widgetData);
+            }
+            if (windowSize != null)
+            {
+                var val = new Uint16Pair(windowSize, false);
+                e.WindowSize = val;
+                val.Dispose();
+            }
+
+            _resizeEventHandler?.Invoke(this, e);
+        }
+
+        internal WidgetInstanceResizeSignalType ResizeSignal()
+        {
+            WidgetInstanceResizeSignalType ret = new WidgetInstanceResizeSignalType(NDalicManualPINVOKE.Widget_ResizeSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Event arguments that passed via update event signal.
+        /// </summary>
+        public class UpdateEventArgs : EventArgs
+        {
+            /// <summary>
+            /// widget data.
+            /// </summary>
+            public WidgetData WidgetData
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// A bundle.
+            /// </summary>
+            public SWIGTYPE_p_bundle Bundle
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// It means several steps.
+            /// </summary>
+            /// <remark>
+            /// 0 -> no force
+            /// 1 -> force but do someting
+            /// 2 -> force
+            /// </remark>
+            public int Force
+            {
+                get;
+                set;
+            }
+        }
+
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate void UpdateCallbackType(IntPtr widgetData, IntPtr bundle, int force);
+        private UpdateCallbackType _updateCallback;
+        private EventHandler<UpdateEventArgs> _updateEventHandler;
+
+        /// <summary>
+        /// Update event.
+        /// </summary>
+        public event EventHandler<UpdateEventArgs> Update
+        {
+            add
+            {
+                if (_updateEventHandler == null)
+                {
+                    _updateCallback = OnUpdate;
+                    UpdateSignal().Connect(_updateCallback);
+                }
+
+                _updateEventHandler += value;
+            }
+
+            remove
+            {
+                _updateEventHandler -= value;
+
+                if (_updateEventHandler == null && UpdateSignal().Empty() == false)
+                {
+                   UpdateSignal().Disconnect(_updateCallback);
+                }
+            }
+        }
+
+        private void OnUpdate(IntPtr widgetData, IntPtr bundle, int force)
+        {
+            UpdateEventArgs e = new UpdateEventArgs();
+            if (widgetData != null)
+            {
+                e.WidgetData = WidgetData.GetWidgetDataFromPtr(widgetData);
+            }
+            if (bundle != null)
+            {
+                e.Bundle = new SWIGTYPE_p_bundle(bundle, false);
+            }
+            e.Force = force;
+
+            _updateEventHandler?.Invoke(this, e);
+        }
+
+        internal WidgetInstanceUpdateSignalType UpdateSignal()
+        {
+            WidgetInstanceUpdateSignalType ret = new WidgetInstanceUpdateSignalType(NDalicManualPINVOKE.Widget_UpdateSignal(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Enumeration for terminate type of widget instance.
+        /// </summary>
+        public enum WidgetTerminateType
+        {
+            /// <summary>
+            /// User deleted this widget from the viewer
+            /// </summary>
+            Permanent,
+            /// <summary>
+            /// Widget is deleted because of other reasons (e.g. widget process is terminated temporarily by the system)
+            /// </summary>
+            Temporary
+        }
+
+        /// <summary>
+        /// Enumeration for lifecycle event type of widget instance.
+        /// </summary>
+        public enum WidgetLifecycleEventType
+        {
+            /// <summary>
+            /// The widget is dead.
+            /// </summary>
+            AppDead = 0,
+            /// <summary>
+            /// The widget is dead.
+            /// </summary>
+            Create = 1,
+            /// <summary>
+            /// The widget is destroyed.
+            /// </summary>
+            Destroy = 2,
+            /// <summary>
+            /// The widget is paused.
+            /// </summary>
+            Pause = 3,
+            /// <summary>
+            /// The widget is resumed.
+            /// </summary>
+            Resume = 4
+        }
+    }
+}
diff --git a/src/Tizen.NUI/src/public/WidgetData.cs b/src/Tizen.NUI/src/public/WidgetData.cs
new file mode 100755 (executable)
index 0000000..7053846
--- /dev/null
@@ -0,0 +1,161 @@
+/** Copyright (c) 2017 Samsung Electronics Co., Ltd.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+namespace Tizen.NUI
+{
+    /// <summary>
+    /// Widget data.
+    /// </summary>
+    public class WidgetData : BaseHandle
+    {
+        private global::System.Runtime.InteropServices.HandleRef swigCPtr;
+
+        internal WidgetData(global::System.IntPtr cPtr, bool cMemoryOwn) : base(NDalicManualPINVOKE.WidgetData_SWIGUpcast(cPtr), cMemoryOwn)
+        {
+            swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
+        }
+
+        internal static global::System.Runtime.InteropServices.HandleRef getCPtr(WidgetData obj)
+        {
+            return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
+        }
+
+        /// <summary>
+        /// To make Window instance be disposed.
+        /// </summary>
+        protected override void Dispose(DisposeTypes type)
+        {
+            if(disposed)
+            {
+                return;
+            }
+
+            if(type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+            }
+
+            //Release your own unmanaged resources here.
+            //You should not access any managed member here except static instance.
+            //because the execution order of Finalizes is non-deterministic.
+
+            if (swigCPtr.Handle != global::System.IntPtr.Zero)
+            {
+                if (swigCMemOwn)
+                {
+                    swigCMemOwn = false;
+                    NDalicManualPINVOKE.delete_WidgetData(swigCPtr);
+                }
+                swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
+            }
+
+            base.Dispose(type);
+        }
+
+        internal static WidgetData GetWidgetDataFromPtr(global::System.IntPtr cPtr)
+        {
+            WidgetData ret = new WidgetData(cPtr, false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        internal WidgetData(string instanceId, SWIGTYPE_p_bundle args, string content) : this(NDalicManualPINVOKE.WidgetData_New(instanceId, SWIGTYPE_p_bundle.getCPtr(args), content), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        internal WidgetData(WidgetData widgetData) : this(NDalicManualPINVOKE.new_WidgetData__SWIG_1(WidgetData.getCPtr(widgetData)), true)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        internal WidgetData Assign(WidgetData widgetData)
+        {
+            WidgetData ret = new WidgetData(NDalicManualPINVOKE.WidgetData_Assign(swigCPtr, WidgetData.getCPtr(widgetData)), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Get widget instance id.
+        /// </summary>
+        /// <returns>Id of widget instance.</returns>
+        public string GetInstanceId()
+        {
+            string ret = NDalicManualPINVOKE.WidgetData_GetInstanceId(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        internal SWIGTYPE_p_bundle GetArgs()
+        {
+            global::System.IntPtr cPtr = NDalicManualPINVOKE.WidgetData_GetArgs(swigCPtr);
+            SWIGTYPE_p_bundle ret = (cPtr == global::System.IntPtr.Zero) ? null : new SWIGTYPE_p_bundle(cPtr, false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Get widget instance content.
+        /// </summary>
+        /// <returns>Content of widget instance.</returns>
+        public string GetContent()
+        {
+            string ret = NDalicManualPINVOKE.WidgetData_GetContent(swigCPtr);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        /// <summary>
+        /// Get widget instance Window.
+        /// </summary>
+        /// <returns>Window of widget instance</returns>
+        public Window GetWindow()
+        {
+            Window ret = new Window(NDalicManualPINVOKE.WidgetData_GetWindow(swigCPtr), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
+        internal void SetArgs(SWIGTYPE_p_bundle args)
+        {
+            NDalicManualPINVOKE.WidgetData_SetArgs(swigCPtr, SWIGTYPE_p_bundle.getCPtr(args));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Set widget instance arguments.
+        /// </summary>
+        /// <param name="content">Content of widget instance</param>
+        public void SetContent(string content)
+        {
+            NDalicManualPINVOKE.WidgetData_SetContent(swigCPtr, content);
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Set widget instance arguments.
+        /// </summary>
+        /// <param name="window">Window of widget instance.</param>
+        public void SetWindow(Window window)
+        {
+            NDalicManualPINVOKE.WidgetData_SetWindow(swigCPtr, Window.getCPtr(window));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+    }
+}
index 8c2b91f..e904b4a 100755 (executable)
@@ -30,6 +30,7 @@ namespace Tizen.NUI
         private global::System.Runtime.InteropServices.HandleRef swigCPtr;
         private global::System.Runtime.InteropServices.HandleRef stageCPtr;
         private Layer _rootLayer;
+        private string _windowTitle;
 
         internal Window(global::System.IntPtr cPtr, bool cMemoryOwn) : base(NDalicPINVOKE.Window_SWIGUpcast(cPtr), cMemoryOwn)
         {
@@ -66,6 +67,56 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
 
+            if (_windowFocusChangedEventCallback != null)
+            {
+                WindowFocusChangedSignal().Disconnect(_windowFocusChangedEventCallback);
+            }
+
+            if (_stageTouchCallbackDelegate != null)
+            {
+                TouchSignal().Disconnect(_stageTouchCallbackDelegate);
+            }
+
+            if (_stageWheelCallbackDelegate != null)
+            {
+                WheelEventSignal().Disconnect(_stageWheelCallbackDelegate);
+            }
+
+            if (_stageKeyCallbackDelegate != null)
+            {
+                KeyEventSignal().Disconnect(_stageKeyCallbackDelegate);
+            }
+
+            if (_stageEventProcessingFinishedEventCallbackDelegate != null)
+            {
+                EventProcessingFinishedSignal().Disconnect(_stageEventProcessingFinishedEventCallbackDelegate);
+            }
+
+            if (_stageContextLostEventCallbackDelegate != null)
+            {
+                ContextLostSignal().Disconnect(_stageContextLostEventCallbackDelegate);
+            }
+
+            if (_stageContextRegainedEventCallbackDelegate != null)
+            {
+                this.ContextRegainedSignal().Disconnect(_stageContextRegainedEventCallbackDelegate);
+            }
+
+            if (_stageSceneCreatedEventCallbackDelegate != null)
+            {
+                SceneCreatedSignal().Disconnect(_stageSceneCreatedEventCallbackDelegate);
+            }
+
+            if (_windowResizedEventCallback != null)
+            {
+                ResizedSignal().Disconnect(_windowResizedEventCallback);
+            }
+
+            if (_windowFocusChangedEventCallback2 != null)
+            {
+                WindowFocusChangedSignal().Disconnect(_windowFocusChangedEventCallback2);
+            }
+
             if (swigCPtr.Handle != global::System.IntPtr.Zero)
             {
                 if (swigCMemOwn)
@@ -379,6 +430,22 @@ namespace Tizen.NUI
             }
         }
 
+        /// <summary>
+        /// Gets/Sets a window title.
+        /// </summary>
+        public string Title
+        {
+            get
+            {
+                return _windowTitle;
+            }
+            set
+            {
+                _windowTitle = value;
+                SetClass( _windowTitle, "" );
+            }
+        }
+
         internal WindowFocusSignalType WindowFocusChangedSignal()
         {
             WindowFocusSignalType ret = new WindowFocusSignalType(NDalicPINVOKE.FocusChangedSignal(swigCPtr), false);
@@ -424,7 +491,12 @@ namespace Tizen.NUI
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
-        internal void SetClass(string name, string klass)
+        /// <summary>
+        /// Sets the window name and class string.
+        /// </summary>
+        /// <param name="name">The name of the window</param>
+        /// <param name="klass">The class of the window</param>
+        public void SetClass(string name, string klass)
         {
             NDalicPINVOKE.Window_SetClass(swigCPtr, name, klass);
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
@@ -767,7 +839,7 @@ namespace Tizen.NUI
             return ret;
         }
 
-        internal System.IntPtr GetNativeWindowHandler()
+        public System.IntPtr GetNativeWindowHandler()
         {
             System.IntPtr ret = NDalicManualPINVOKE.GetNativeWindowHandler(HandleRef.ToIntPtr(this.swigCPtr));
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
@@ -1414,6 +1486,11 @@ namespace Tizen.NUI
             }
         }
 
+        public static void FeedKeyEvent(Key keyEvent)
+        {
+            NDalicManualPINVOKE.Window_FeedKeyEvent(Key.getCPtr(keyEvent));
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
 
     }
 }
index d9e9bef..f4e6b1a 100755 (executable)
@@ -51,7 +51,7 @@ namespace Tizen.Network.Nsd
         /// </summary>
         /// <param name="serviceType">The DNSSD service type</param>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="ArgumentException">Thrown when serviceType is null.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD is not supported.</exception>
         public DnssdBrowser(string serviceType)
@@ -76,7 +76,7 @@ namespace Tizen.Network.Nsd
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
         /// <privilege>http://tizen.org/privilege/internet</privilege>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD is not supported.</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when permission is denied.</exception>
@@ -107,7 +107,7 @@ namespace Tizen.Network.Nsd
         /// Stops browsing the DNSSD remote service.
         /// </summary>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD is not supported.</exception>
         public void StopDiscovery()
index 803c6b8..fdf5880 100755 (executable)
@@ -55,7 +55,7 @@ namespace Tizen.Network.Nsd
         /// <param name="serviceType">The DNSSD service type. It is expressed as type followed by protocol, separated by a dot(e.g. "_ftp._tcp").
         /// It must begin with an underscore, followed by 1-15 characters which may be letters, digits or hyphens.
         /// </param>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="NotSupportedException">Thrown while setting this property when DNSSD is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown when serviceType is set to null.</exception>
         public DnssdService(string serviceType)
@@ -90,7 +90,7 @@ namespace Tizen.Network.Nsd
         /// In case of error, null will be returned during get and exception will be thrown during set.
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="NotSupportedException">Thrown while setting this property when DNSSD is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown when Name value is set to null.</exception>
         /// <exception cref="InvalidOperationException">Thrown while setting this property when any other error occurred.</exception>
@@ -158,7 +158,7 @@ namespace Tizen.Network.Nsd
         /// In case of error, -1 will be returned during get and exception will be thrown during set.
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="NotSupportedException">Thrown while setting this property when DNSSD is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown if value of Port is set to less than 0 or more than 65535.</exception>
         /// <exception cref="InvalidOperationException">Thrown while setting this property when any other error occurred.</exception>
@@ -237,7 +237,7 @@ namespace Tizen.Network.Nsd
         /// <since_tizen> 4 </since_tizen>
         /// <param name="key">The key of the TXT record. It must be a null-terminated string with 9 characters or fewer excluding null. It is case insensitive.</param>
         /// <param name="value">The value of the TXT record.If null, then "key" will be added with no value. If non-null but value_length is zero, then "key=" will be added with empty value.</param>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="NotSupportedException">Thrown when DNSSD is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown when value of key is null.</exception>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
@@ -269,7 +269,7 @@ namespace Tizen.Network.Nsd
         /// </summary>
         /// <since_tizen> 4 </since_tizen>
         /// <param name="key">The key of the TXT record to be removed.</param>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="NotSupportedException">Thrown when DNSSD is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown when value of key is null.</exception>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
@@ -302,7 +302,7 @@ namespace Tizen.Network.Nsd
         /// Name of the service must be set.
         /// <since_tizen> 4 </since_tizen>
         /// <privilege>http://tizen.org/privilege/internet</privilege>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD is not supported.</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when permission is denied.</exception>
@@ -337,7 +337,7 @@ namespace Tizen.Network.Nsd
         /// A local service registered using RegisterService() must be passed.
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD is not supported.</exception>
         public void DeregisterService()
index 524f921..9782a33 100755 (executable)
@@ -30,8 +30,8 @@ namespace Tizen.Network.Nsd
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
         /// <privilege>http://tizen.org/privilege/internet</privilege>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occured.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD/SSDP is not supported.</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when permission is denied.</exception>
@@ -41,8 +41,8 @@ namespace Tizen.Network.Nsd
         /// Stops browsing the DNSSD/SSDP remote service.
         /// </summary>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occured.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD/SSDP is not supported.</exception>
         void StopDiscovery();
index 594fbf0..7b0c6e3 100755 (executable)
@@ -31,8 +31,8 @@ namespace Tizen.Network.Nsd
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
         /// <privilege>http://tizen.org/privilege/internet</privilege>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD/SSDP is not supported.</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when permission is denied.</exception>
@@ -45,8 +45,8 @@ namespace Tizen.Network.Nsd
         /// A local service registered using RegisterService() must be passed.
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.dnssd</feature>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.dnssd</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when DNSSD/SSDP is not supported.</exception>
         void DeregisterService();
index 1ec8bba..e1e4b61 100644 (file)
@@ -8,10 +8,10 @@ The Tizen.Network.Nsd namespace provides classes to manage the network service d
 </para>
 <h2>Related Features</h2>
 <para>To use DNS-SD, declare the following feature requirements in the config file:<br/>
-http://tizen.org/feature/network.dnssd
+http://tizen.org/feature/network.service_discovery.dnssd
 </para>
 <para>To use SSDP, declare the following feature requirements in the config file:<br/>
-http://tizen.org/feature/network.ssdp
+http://tizen.org/feature/network.service_discovery.ssdp
 </para>
 
 </remarks>
index 2dfb586..69bfd78 100755 (executable)
@@ -51,7 +51,7 @@ namespace Tizen.Network.Nsd
         /// </summary>
         /// <since_tizen> 4 </since_tizen>
         /// <param name="target">The target to browse for the service.</param>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="ArgumentException">Thrown when target is null.</exception>
         /// <exception cref="NotSupportedException">Thrown when SSDP is not supported.</exception>
         public SsdpBrowser(string target)
@@ -75,7 +75,7 @@ namespace Tizen.Network.Nsd
         /// Application will keep browsing for available/unavailable services until it calls StopDiscovery().
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occured.</exception>
         /// <exception cref="NotSupportedException">Thrown when SSDP is not supported.</exception>
         public void StartDiscovery()
@@ -106,7 +106,7 @@ namespace Tizen.Network.Nsd
         /// </summary>
         /// <since_tizen> 4 </since_tizen>
         /// <privilege>http://tizen.org/privilege/internet</privilege>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occured.</exception>
         /// <exception cref="NotSupportedException">Thrown when SSDP is not supported.</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when permission is denied.</exception>
index 25cc8f3..06cc83d 100755 (executable)
@@ -51,7 +51,7 @@ namespace Tizen.Network.Nsd
         /// </summary>
         /// <since_tizen> 4 </since_tizen>
         /// <param name="target">The SSDP local service's target. It may be a device type or a service type.</param>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="NotSupportedException">Thrown while setting this property when SSDP is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown when target is set to null.</exception>
         public SsdpService(string target)
@@ -85,7 +85,7 @@ namespace Tizen.Network.Nsd
         /// In case of error, null will be returned during get and exception will be thrown during set.
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="NotSupportedException">Thrown while setting this property when SSDP is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown when Usn value is set to null.</exception>
         /// <exception cref="InvalidOperationException">Thrown while setting this property when any other error occurred.</exception>
@@ -152,7 +152,7 @@ namespace Tizen.Network.Nsd
         /// In case of error, null will be returned during get and exception will be thrown during set.
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="NotSupportedException">Thrown while setting this property when SSDP is not supported.</exception>
         /// <exception cref="ArgumentException">Thrown when Url value is set to null.</exception>
         /// <exception cref="InvalidOperationException">Thrown while setting this property when any other error occurred.</exception>
@@ -196,7 +196,7 @@ namespace Tizen.Network.Nsd
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
         /// <privilege>http://tizen.org/privilege/internet</privilege>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when SSDP is not supported.</exception>
         /// <exception cref="UnauthorizedAccessException">Thrown when permission is denied.</exception>
@@ -226,7 +226,7 @@ namespace Tizen.Network.Nsd
         /// A local service registered using RegisterService() must be passed.
         /// </remarks>
         /// <since_tizen> 4 </since_tizen>
-        /// <feature>http://tizen.org/feature/network.ssdp</feature>
+        /// <feature>http://tizen.org/feature/network.service_discovery.ssdp</feature>
         /// <exception cref="InvalidOperationException">Thrown when any other error occurred.</exception>
         /// <exception cref="NotSupportedException">Thrown when SSDP is not supported.</exception>
         public void DeregisterService()
old mode 100755 (executable)
new mode 100644 (file)
index 03602e2..238d76e
@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26430.12
+VisualStudioVersion = 15.0.26430.13
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Pims.Contacts", "Tizen.Pims.Contacts.csproj", "{5B40ACBE-A9D5-492B-AB98-11DD8581941E}"
 EndProject
index c1a4043..4be2929 100644 (file)
@@ -33,7 +33,7 @@ namespace Tizen.Pims.Contacts
         private Object thisLock = new Object();
         private Interop.Database.ContactsDBStatusChangedCallback _contactsDBStatusChangedCallback;
         private EventHandler<DBStatusChangedEventArgs> _dbStatusChanged;
-        private Dictionary<string, EventHandler<DBChangedEventArgs>> _delegateMap = new Dictionary<string, EventHandler<DBChangedEventArgs>>();
+        private Dictionary<string, EventHandler<DBChangedEventArgs>> _eventHandlerMap = new Dictionary<string, EventHandler<DBChangedEventArgs>>();
         private Dictionary<string, Interop.Database.ContactsDBChangedCallback> _callbackMap = new Dictionary<string, Interop.Database.ContactsDBChangedCallback>();
         private Interop.Database.ContactsDBChangedCallback _dbChangedDelegate;
 
@@ -709,48 +709,56 @@ namespace Tizen.Pims.Contacts
         }
 
         /// <summary>
-        /// Registers a callback function to be invoked when a record changes.
+        /// Registers a EventHandler to be invoked when a record changes.
         /// </summary>
         /// <param name="viewUri">The view URI of records whose changes are monitored</param>
         /// <param name="DBChanged">The EventHandler to register</param>
         [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")]
-        public void AddDBChangedDelegate(string viewUri, EventHandler<DBChangedEventArgs> DBChanged)
+        public void AddDBChangedEventHandler(string viewUri, EventHandler<DBChangedEventArgs> DBChanged)
         {
-            if (_callbackMap[viewUri] == null)
+            if (!_callbackMap.ContainsKey(viewUri))
             {
                 _callbackMap[viewUri] = (string uri, IntPtr userData) =>
                 {
                     DBChangedEventArgs args = new DBChangedEventArgs(uri);
-                    _delegateMap[uri]?.Invoke(this, args);
+                    _eventHandlerMap[uri]?.Invoke(this, args);
                 };
 
                 int error = Interop.Database.AddChangedCb(viewUri, _callbackMap[viewUri], IntPtr.Zero);
                 if ((int)ContactsError.None != error)
                 {
-                    Log.Error(Globals.LogTag, "AddDBChangedDelegate Failed with error " + error);
+                    Log.Error(Globals.LogTag, "AddDBChangedEventHandler Failed with error " + error);
                     throw ContactsErrorFactory.CheckAndCreateException(error);
                 }
             }
 
-            _delegateMap[viewUri] += DBChanged;
+            EventHandler<DBChangedEventArgs> handler = null;
+            if (!_eventHandlerMap.TryGetValue(viewUri, out handler))  
+                _eventHandlerMap.Add(viewUri, null);
+
+            _eventHandlerMap[viewUri] = handler + DBChanged;
         }
 
         /// <summary>
-        /// Deregisters a callback function.
+        /// Deregisters a EventHandler.
         /// </summary>
         /// <param name="viewUri">The view URI of records whose changes are monitored</param>
         /// <param name="DBChanged">The EventHandler to deregister</param>
         [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")]
-        public void RemoveDBChangedDelegate(string viewUri, EventHandler<DBChangedEventArgs> DBChanged)
+        public void RemoveDBChangedEventHandler(string viewUri, EventHandler<DBChangedEventArgs> DBChanged)
         {
-            _delegateMap[viewUri] -= DBChanged;
+            EventHandler<DBChangedEventArgs> handler = null;
+            if (!_eventHandlerMap.TryGetValue(viewUri, out handler))
+                _eventHandlerMap.Add(viewUri, null);
+            else
+                _eventHandlerMap[viewUri] = handler - DBChanged;
 
-            if (_delegateMap[viewUri] == null)
+            if (_eventHandlerMap[viewUri] == null)
             {
                 int error = Interop.Database.RemoveChangedCb(viewUri, _callbackMap[viewUri], IntPtr.Zero);
                 if ((int)ContactsError.None != error)
                 {
-                    Log.Error(Globals.LogTag, "RemoveDBChangedDelegate Failed with error " + error);
+                    Log.Error(Globals.LogTag, "RemoveDBChangedEventHandler Failed with error " + error);
                     throw ContactsErrorFactory.CheckAndCreateException(error);
                 }
                 _callbackMap.Remove(viewUri);