[NUI] Unsubscribe theme changed event when the view is not on window
authorJiyun Yang <ji.yang@samsung.com>
Wed, 18 Nov 2020 08:27:39 +0000 (17:27 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Thu, 19 Nov 2020 03:25:38 +0000 (12:25 +0900)
Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
src/Tizen.NUI/src/public/BaseComponents/ViewBindableProperty.cs
src/Tizen.NUI/src/public/BaseComponents/ViewInternal.cs
src/Tizen.NUI/src/public/Theme/ThemeManager.cs

index 62ae5b0..3d22e66 100755 (executable)
@@ -1622,11 +1622,11 @@ namespace Tizen.NUI.BaseComponents
 
             if (view.themeChangeSensitive)
             {
-                ThemeManager.ThemeChangedInternal += view.OnThemeChanged;
+                view.SubscribeThemeChange();
             }
             else
             {
-                ThemeManager.ThemeChangedInternal -= view.OnThemeChanged;
+                view.UnsubscribeThemeChange();
             }
         },
         defaultValueCreator: (bindable) =>
index 08f2c0e..20c499e 100755 (executable)
@@ -33,6 +33,7 @@ namespace Tizen.NUI.BaseComponents
     {
         private MergedStyle mergedStyle = null;
         private ViewSelectorData selectorData;
+        private uint lastThemeChangeId;
         internal string styleName;
 
         internal MergedStyle _mergedStyle
@@ -1054,6 +1055,8 @@ namespace Tizen.NUI.BaseComponents
 
         internal void UpdateStyle()
         {
+            lastThemeChangeId = ThemeManager.ChangeId;
+
             ViewStyle newStyle;
             if (styleName == null) newStyle = ThemeManager.GetStyle(GetType());
             else newStyle = ThemeManager.GetStyle(styleName);
@@ -1081,9 +1084,10 @@ namespace Tizen.NUI.BaseComponents
                 //Release your own managed resources here.
                 //You should release all of your own disposable objects here.
                 selectorData?.Reset(this);
-                if (themeChangeSensitive)
+
+                if (themeChangeSensitive && IsOnWindow)
                 {
-                    ThemeManager.ThemeChanged -= OnThemeChanged;
+                    ThemeManager.ThemeChangedInternal -= OnThemeChanged;
                 }
             }
 
@@ -1335,5 +1339,49 @@ namespace Tizen.NUI.BaseComponents
         {
             return false;
         }
+
+        private void OnAddedToWindowInternal(object sender, global::System.EventArgs args)
+        {
+            if (lastThemeChangeId != ThemeManager.ChangeId)
+            {
+                OnThemeChanged(null, new ThemeChangedEventArgs(ThemeManager.CurrentTheme?.Id));
+            }
+            AddedToWindow -= OnAddedToWindowInternal;
+            RemovedFromWindow += OnRemovedFromWindowInternal;
+            ThemeManager.ThemeChangedInternal += OnThemeChanged;
+        }
+
+        private void OnRemovedFromWindowInternal(object sender, global::System.EventArgs args)
+        {
+            ThemeManager.ThemeChangedInternal -= OnThemeChanged;
+            RemovedFromWindow -= OnRemovedFromWindowInternal;
+            AddedToWindow += OnAddedToWindowInternal;
+        }
+
+        private void SubscribeThemeChange()
+        {
+            if (IsOnWindow)
+            {
+                ThemeManager.ThemeChangedInternal += OnThemeChanged;
+                RemovedFromWindow += OnRemovedFromWindowInternal;
+            }
+            else
+            {
+                AddedToWindow += OnAddedToWindowInternal;
+            }
+        }
+
+        private void UnsubscribeThemeChange()
+        {
+            if (IsOnWindow)
+            {
+                ThemeManager.ThemeChangedInternal -= OnThemeChanged;
+                RemovedFromWindow -= OnRemovedFromWindowInternal;
+            }
+            else
+            {
+                AddedToWindow -= OnAddedToWindowInternal;
+            }
+        }
     }
 }
index 239b57b..6a4b08d 100644 (file)
@@ -88,6 +88,7 @@ namespace Tizen.NUI
             set
             {
                 currentTheme = value;
+                ChangeId++;
                 NotifyThemeChanged();
             }
         }
@@ -109,6 +110,8 @@ namespace Tizen.NUI
 
         internal static bool ThemeApplied => (CurrentTheme.Count > 0 || DefaultTheme.Count > 0);
 
+        internal static uint ChangeId { get; set; }
+
         private static Profile CurrentProfile
         {
             get