Skip to content

Commit

Permalink
Add ClearCacheProgressChanged EventHandler (#6183)
Browse files Browse the repository at this point in the history
Signed-off-by: Ilho Kim <[email protected]>
  • Loading branch information
ilho159kim authored Jun 28, 2024
1 parent c56a121 commit 5330a16
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ internal enum EventStatus
Move = 0x08,
ClearData = 0x10,
Progress = 0x20,
ClearCache = 0x800,
}

internal enum EventType
Expand All @@ -76,7 +77,8 @@ internal enum EventType
Uninstall = 1,
Update = 2,
Move = 3,
ClearData = 4
ClearData = 4,
ClearCache = 1000,
}

internal enum CertCompareResultType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static class PackageManager
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);
Expand Down Expand Up @@ -205,6 +206,34 @@ public static event EventHandler<PackageManagerEventArgs> ClearDataProgressChang
}
}

/// <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
Expand Down Expand Up @@ -1375,6 +1404,7 @@ private static void UnsetPackageManagerEventStatus()
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;

Expand All @@ -1394,7 +1424,7 @@ private static void UnsetPackageManagerEventStatus()

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)
Expand All @@ -1419,8 +1449,7 @@ private static void RegisterPackageManagerEventIfNeeded()
}
}

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
{
Expand Down Expand Up @@ -1460,9 +1489,40 @@ private static void InternalEventCallback(string packageType, string packageId,
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;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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; } }
}
}

0 comments on commit 5330a16

Please sign in to comment.