diff --git a/src/Tizen.NUI/src/public/Input/InputMethodContext.cs b/src/Tizen.NUI/src/public/Input/InputMethodContext.cs index c188e3006e5..e747f301c8d 100755 --- a/src/Tizen.NUI/src/public/Input/InputMethodContext.cs +++ b/src/Tizen.NUI/src/public/Input/InputMethodContext.cs @@ -879,11 +879,41 @@ protected override void Dispose(DisposeTypes type) //You should not access any managed member here except static instance //because the execution order of Finalizes is non-deterministic. + if (activatedEventCallback != null) + { + ActivatedSignal().Disconnect(activatedEventCallback); + } + + if (eventReceivedEventCallback != null) + { + EventReceivedSignal().Disconnect(eventReceivedEventCallback); + } + + if (statusChangedEventCallback != null) + { + StatusChangedSignal().Disconnect(statusChangedEventCallback); + } + + if (resizedEventCallback != null) + { + ResizedSignal().Disconnect(resizedEventCallback); + } + + if (languageChangedEventCallback != null) + { + LanguageChangedSignal().Disconnect(languageChangedEventCallback); + } + if (keyboardTypeChangedEventCallback != null) { KeyboardTypeChangedSignal().Disconnect(keyboardTypeChangedEventCallback); } + if (contentReceivedEventCallback != null) + { + ContentReceivedSignal().Disconnect(contentReceivedEventCallback); + } + base.Dispose(type); } @@ -896,6 +926,12 @@ protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef private void OnActivated(IntPtr data) { + if (Disposed || IsDisposeQueued) + { + // Ignore native callback if InputMethodContext is disposed or queued for disposal. + return; + } + ActivatedEventArgs e = new ActivatedEventArgs(); if (data != IntPtr.Zero) @@ -911,6 +947,12 @@ private void OnActivated(IntPtr data) private IntPtr OnEventReceived(IntPtr inputMethodContext, IntPtr eventData) { + if (Disposed || IsDisposeQueued) + { + // Ignore native callback if InputMethodContext is disposed or queued for disposal. + return IntPtr.Zero; + } + CallbackData callbackData = null; EventReceivedEventArgs e = new EventReceivedEventArgs(); @@ -940,6 +982,12 @@ private IntPtr OnEventReceived(IntPtr inputMethodContext, IntPtr eventData) private void OnStatusChanged(bool statusChanged) { + if (Disposed || IsDisposeQueued) + { + // Ignore native callback if InputMethodContext is disposed or queued for disposal. + return; + } + StatusChangedEventArgs e = new StatusChangedEventArgs(); e.StatusChanged = statusChanged; @@ -952,6 +1000,12 @@ private void OnStatusChanged(bool statusChanged) private void OnResized(int resized) { + if (Disposed || IsDisposeQueued) + { + // Ignore native callback if InputMethodContext is disposed or queued for disposal. + return; + } + ResizedEventArgs e = new ResizedEventArgs(); e.Resized = resized; @@ -963,6 +1017,12 @@ private void OnResized(int resized) private void OnLanguageChanged(int languageChanged) { + if (Disposed || IsDisposeQueued) + { + // Ignore native callback if InputMethodContext is disposed or queued for disposal. + return; + } + LanguageChangedEventArgs e = new LanguageChangedEventArgs(); e.LanguageChanged = languageChanged; @@ -974,6 +1034,12 @@ private void OnLanguageChanged(int languageChanged) private void OnKeyboardTypeChanged(KeyboardType type) { + if (Disposed || IsDisposeQueued) + { + // Ignore native callback if InputMethodContext is disposed or queued for disposal. + return; + } + KeyboardTypeChangedEventArgs e = new KeyboardTypeChangedEventArgs(); e.KeyboardType = type; @@ -986,6 +1052,12 @@ private void OnKeyboardTypeChanged(KeyboardType type) private void OnContentReceived(string content, string description, string mimeType) { + if (Disposed || IsDisposeQueued) + { + // Ignore native callback if InputMethodContext is disposed or queued for disposal. + return; + } + ContentReceivedEventArgs e = new ContentReceivedEventArgs(); e.Content = content; e.Description = description;