Add ClearCacheProgressChanged EventHandler (#6183)
authorilho159kim <ilho159.kim@samsung.com>
Fri, 28 Jun 2024 04:29:09 +0000 (13:29 +0900)
committerGitHub <noreply@github.com>
Fri, 28 Jun 2024 04:29:09 +0000 (13:29 +0900)
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
src/Tizen.Applications.PackageManager/Interop/Interop.PackageManager.cs
src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManager.cs
src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManagerClearCacheEventArgs.cs [new file with mode: 0755]

index 58596255e9004d14e7c119d2e81d5925613a7fe5..5cddd271d23abf5999b0439bf5d7aca749890f2f 100755 (executable)
@@ -68,6 +68,7 @@ internal static partial class Interop
             Move = 0x08,
             ClearData = 0x10,
             Progress = 0x20,
+            ClearCache = 0x800,
         }
 
         internal enum EventType
@@ -76,7 +77,8 @@ internal static partial class Interop
             Uninstall = 1,
             Update = 2,
             Move = 3,
-            ClearData = 4
+            ClearData = 4,
+            ClearCache = 1000,
         }
 
         internal enum CertCompareResultType
index 169b2db2de6a4dfa7844d9fc622938d45c14fdc4..9f01052a4db88e203dc53488743202d087fbdb49 100755 (executable)
@@ -43,6 +43,7 @@ namespace Tizen.Applications
         private static event EventHandler<PackageManagerEventArgs> s_updateEventHandler;
         private static event EventHandler<PackageManagerEventArgs> s_moveEventHandler;
         private static event EventHandler<PackageManagerEventArgs> s_clearDataEventHandler;
+        private static event EventHandler<PackageManagerClearCacheEventArgs> s_clearCacheEventHandler;
 
         private static readonly object s_pkgEventLock = new object();
         private static Interop.PackageManager.PackageManagerEventCallback s_packageManagerEventCallback = new Interop.PackageManager.PackageManagerEventCallback(InternalEventCallback);
@@ -205,6 +206,34 @@ namespace Tizen.Applications
             }
         }
 
+        /// <summary>
+        /// ClearCacheProgressChanged event. This event occurs when cache directories are cleared in the given package.
+        /// </summary>
+        /// <exception cref="IOException">Thrown when subscribing to package manager event failed.</exception>
+        /// <since_tizen> 12 </since_tizen>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static event EventHandler<PackageManagerClearCacheEventArgs> ClearCacheProgressChanged
+        {
+            add
+            {
+                lock (s_pkgEventLock)
+                {
+                    SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.ClearCache);
+                    RegisterPackageManagerEventIfNeeded();
+                    s_clearCacheEventHandler += value;
+                }
+            }
+            remove
+            {
+                lock (s_pkgEventLock)
+                {
+                    s_clearCacheEventHandler -= value;
+                    UnregisterPackageManagerEventIfNeeded();
+                    UnsetPackageManagerEventStatus();
+                }
+            }
+        }
+
         private static SafePackageManagerHandle Handle
         {
             get
@@ -1375,6 +1404,7 @@ namespace Tizen.Applications
             if (s_updateEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.Upgrade;
             if (s_moveEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.Move;
             if (s_clearDataEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.ClearData;
+            if (s_clearCacheEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.ClearCache;
             if (eventStatus != Interop.PackageManager.EventStatus.All)
                 eventStatus |= Interop.PackageManager.EventStatus.Progress;
 
@@ -1394,7 +1424,7 @@ namespace Tizen.Applications
 
         private static void RegisterPackageManagerEventIfNeeded()
         {
-            if (s_installEventHandler != null && s_uninstallEventHandler != null && s_updateEventHandler != null && s_moveEventHandler != null && s_clearDataEventHandler != null)
+            if (s_installEventHandler != null && s_uninstallEventHandler != null && s_updateEventHandler != null && s_moveEventHandler != null && s_clearDataEventHandler != null && s_clearCacheEventHandler != null)
                 return;
 
             if ((s_registered_eventStatus & s_eventStatus) == s_eventStatus)
@@ -1419,8 +1449,7 @@ namespace Tizen.Applications
             }
         }
 
-        private static void InternalEventCallback(string packageType, string packageId, Interop.PackageManager.EventType eventType, Interop.PackageManager.PackageEventState eventState, int progress, Interop.PackageManager.ErrorCode error, IntPtr user_data)
-        {
+        private static void HandlePackageEventCallback(string packageType, string packageId, Interop.PackageManager.EventType eventType, Interop.PackageManager.PackageEventState eventState, int progress, Interop.PackageManager.ErrorCode error, IntPtr user_data) {
             PackageManagerEventArgs args;
             try
             {
@@ -1460,9 +1489,40 @@ namespace Tizen.Applications
             handlers?.Invoke(null, args);
         }
 
+        private static void HandleClearCacheEventCallback(string packageId, Interop.PackageManager.PackageEventState eventState, IntPtr user_data)
+        {
+            PackageManagerClearCacheEventArgs args;
+            try
+            {
+                args = new PackageManagerClearCacheEventArgs(packageId, (PackageEventState)eventState);
+            }
+            catch (Exception e)
+            {
+                Log.Warn(LogTag, e.Message);
+                return;
+            }
+
+            EventHandler<PackageManagerClearCacheEventArgs> handlers = null;
+            lock (s_pkgEventLock)
+            {
+                handlers = s_clearCacheEventHandler;
+            }
+
+            handlers?.Invoke(null, args);
+        }
+
+        private static void InternalEventCallback(string packageType, string packageId, Interop.PackageManager.EventType eventType, Interop.PackageManager.PackageEventState eventState, int progress, Interop.PackageManager.ErrorCode error, IntPtr user_data)
+        {
+            if (eventType == Interop.PackageManager.EventType.ClearCache) {
+                HandleClearCacheEventCallback(packageId, eventState, user_data);
+            } else {
+                HandlePackageEventCallback(packageType, packageId, eventType, eventState, progress, error, user_data);
+            }
+        }
+
         private static void UnregisterPackageManagerEventIfNeeded()
         {
-            if (s_packageManagerEventCallback == null || s_installEventHandler != null || s_uninstallEventHandler != null || s_updateEventHandler != null || s_moveEventHandler != null || s_clearDataEventHandler != null)
+            if (s_packageManagerEventCallback == null || s_installEventHandler != null || s_uninstallEventHandler != null || s_updateEventHandler != null || s_moveEventHandler != null || s_clearDataEventHandler != null || s_clearCacheEventHandler != null)
             {
                 return;
             }
diff --git a/src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManagerClearCacheEventArgs.cs b/src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManagerClearCacheEventArgs.cs
new file mode 100755 (executable)
index 0000000..585c80b
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2024 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.ComponentModel;
+
+namespace Tizen.Applications
+{
+    /// <summary>
+    /// PackageManagerClearCacheEventArgs class. This class is an event arguments of the ClearCacheProgressChanged events.
+    /// </summary>
+    /// <since_tizen> 12 </since_tizen>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class PackageManagerClearCacheEventArgs : EventArgs
+    {
+        private readonly string _packageId;
+        private readonly PackageEventState _state;
+
+        internal PackageManagerClearCacheEventArgs(string packageId, PackageEventState state)
+        {
+            _packageId = packageId;
+            _state = state;
+        }
+
+        /// <summary>
+        /// Package ID, Target of clear cache event.
+        /// </summary>
+        /// <since_tizen> 12 </since_tizen>
+        public string PackageId { get { return _packageId; } }
+
+        /// <summary>
+        /// Current state of the request to the package manager.
+        /// </summary>
+        /// <since_tizen> 12 </since_tizen>
+        public PackageEventState State { get { return _state; } }
+    }
+}