2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Collections.Generic;
19 using System.Threading.Tasks;
22 namespace Tizen.Applications
25 /// PackageManager class. This class has the methods and events of the PackageManager.
28 /// The package manager is one of the core modules of Tizen application framework, and responsible for getting their information.
29 /// You can also retrieve information related to the packages that are installed on the device.
31 public static class PackageManager
33 private const string LogTag = "Tizen.Applications.PackageManager";
35 private static SafePackageManagerHandle s_handle = new SafePackageManagerHandle();
36 private static Interop.PackageManager.EventStatus s_eventStatus = Interop.PackageManager.EventStatus.All;
37 private static event EventHandler<PackageManagerEventArgs> s_installEventHandler;
38 private static event EventHandler<PackageManagerEventArgs> s_uninstallEventHandler;
39 private static event EventHandler<PackageManagerEventArgs> s_updateEventHandler;
40 private static event EventHandler<PackageManagerEventArgs> s_moveEventHandler;
41 private static event EventHandler<PackageManagerEventArgs> s_clearDataEventHandler;
43 private static Interop.PackageManager.PackageManagerEventCallback s_packageManagerEventCallback;
46 /// Event Callback Method for the request.
48 /// <param name="type">Type of the package which was requested</param>
49 /// <param name="packageId">ID of the package which was requested</param>
50 /// <param name="eventType">Event type of the request</param>
51 /// <param name="eventState">Current event state of the request</param>
52 /// <param name="progress">Progress for the request being processed by the package manager (in percent)</param>
53 public delegate void RequestEventCallback(string type, string packageId, PackageEventType eventType, PackageEventState eventState, int progress);
55 private static Dictionary<int, RequestEventCallback> RequestCallbacks = new Dictionary<int, RequestEventCallback>();
56 private static Dictionary<int, SafePackageManagerRequestHandle> RequestHandles = new Dictionary<int, SafePackageManagerRequestHandle>();
59 /// InstallProgressChanged event. This event is occurred when a package is getting installed and the progress of the request to the package manager changes.
61 public static event EventHandler<PackageManagerEventArgs> InstallProgressChanged
65 SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Install);
66 RegisterPackageManagerEventIfNeeded();
67 s_installEventHandler += value;
71 s_installEventHandler -= value;
72 UnregisterPackageManagerEventIfNeeded();
73 UnsetPackageManagerEventStatus();
78 /// UninstallProgressChanged event. This event is occurred when a package is getting uninstalled and the progress of the request to the package manager changes.
80 public static event EventHandler<PackageManagerEventArgs> UninstallProgressChanged
84 SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Uninstall);
85 RegisterPackageManagerEventIfNeeded();
86 s_uninstallEventHandler += value;
90 s_uninstallEventHandler -= value;
91 UnregisterPackageManagerEventIfNeeded();
92 UnsetPackageManagerEventStatus();
97 /// UpdateProgressChanged event. This event is occurred when a package is getting updated and the progress of the request to the package manager changes.
99 public static event EventHandler<PackageManagerEventArgs> UpdateProgressChanged
103 SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Upgrade);
104 RegisterPackageManagerEventIfNeeded();
105 s_updateEventHandler += value;
109 s_updateEventHandler -= value;
110 UnregisterPackageManagerEventIfNeeded();
111 UnsetPackageManagerEventStatus();
116 /// MoveProgressChanged event. This event is occurred when a package is getting moved and the progress of the request to the package manager changes.
118 public static event EventHandler<PackageManagerEventArgs> MoveProgressChanged
122 SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Move);
123 RegisterPackageManagerEventIfNeeded();
124 s_moveEventHandler += value;
128 s_moveEventHandler -= value;
129 UnregisterPackageManagerEventIfNeeded();
130 UnsetPackageManagerEventStatus();
135 /// ClearDataProgressChanged event. This event is occurred when data directories are cleared in the given package.
137 public static event EventHandler<PackageManagerEventArgs> ClearDataProgressChanged
141 SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.ClearData);
142 RegisterPackageManagerEventIfNeeded();
143 s_clearDataEventHandler += value;
147 s_clearDataEventHandler -= value;
148 UnregisterPackageManagerEventIfNeeded();
149 UnsetPackageManagerEventStatus();
153 private static SafePackageManagerHandle Handle
157 if (s_handle.IsInvalid)
159 var err = Interop.PackageManager.PackageManagerCreate(out s_handle);
160 if (err != Interop.PackageManager.ErrorCode.None)
162 Log.Warn(LogTag, string.Format("Failed to create package manager handle. err = {0}", err));
169 private static Interop.PackageManager.PackageManagerRequestEventCallback internalRequestEventCallback = (id, packageType, packageId, eventType, eventState, progress, error, userData) =>
171 if (RequestCallbacks.ContainsKey(id))
175 RequestCallbacks[id](packageType, packageId, (PackageEventType)eventType, (PackageEventState)eventState, progress);
176 if (eventState == Interop.PackageManager.PackageEventState.Completed || eventState == Interop.PackageManager.PackageEventState.Failed)
178 Log.Debug(LogTag, string.Format("release request handle for id : {0}", id));
179 RequestHandles[id].Dispose();
180 RequestHandles.Remove(id);
181 RequestCallbacks.Remove(id);
186 Log.Warn(LogTag, e.Message);
187 RequestHandles[id].Dispose();
188 RequestHandles.Remove(id);
189 RequestCallbacks.Remove(id);
195 /// Gets the package ID for the given app ID.
197 /// <param name="applicationId">The ID of the application</param>
198 /// <returns>Returns the ID of the package. Empty string if App ID does not exist</returns>
199 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
200 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
201 /// <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
202 public static string GetPackageIdByApplicationId(string applicationId)
205 var err = Interop.PackageManager.PackageManageGetPackageIdByAppId(applicationId, out packageId);
206 if (err != Interop.PackageManager.ErrorCode.None)
208 Log.Warn(LogTag, string.Format("Failed to get package Id of {0}. err = {1}", applicationId, err));
209 if (err != Interop.PackageManager.ErrorCode.InvalidParameter)
211 throw PackageManagerErrorFactory.GetException(err, "Failed to get package Id");
218 /// Gets the package information for the given package.
220 /// <param name="packageId">The ID of the package</param>
221 /// <returns>Returns the package information for the given package ID.</returns>
222 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
223 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
224 /// <exception cref="System.IO.IOException">Thrown when method failed due to internal IO error</exception>
225 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
226 /// <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
227 public static Package GetPackage(string packageId)
229 return Package.GetPackage(packageId);
233 /// Clears the application's internal and external cache directory.
235 /// <param name="packageId">Id of the package</param>
236 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
237 /// <exception cref="System.IO.IOException">Thrown when method failed due to internal IO error</exception>
238 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
239 /// <exception cref="SystemException">Thrown when method failed due to internal system error</exception>
240 /// <privilege>http://tizen.org/privilege/packagemanager.clearcache</privilege>
241 public static void ClearCacheDirectory(string packageId)
243 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerClearCacheDir(packageId);
244 if (err != Interop.PackageManager.ErrorCode.None)
246 Log.Warn(LogTag, string.Format("Failed to clear cache directory for {0}. err = {1}", packageId, err));
247 throw PackageManagerErrorFactory.GetException(err, "Failed to clear cache directory");
252 /// Clears all application's internal and external cache directory.
254 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
255 /// <exception cref="System.IO.IOException">Thrown when method failed due to internal IO error</exception>
256 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
257 /// <exception cref="SystemException">Thrown when method failed due to internal system error</exception>
258 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
259 public static void ClearAllCacheDirectory()
261 var err = Interop.PackageManager.PackageManagerClearAllCacheDir();
262 if (err != Interop.PackageManager.ErrorCode.None)
264 Log.Warn(LogTag, string.Format("Failed to clear all cache directories. err = {0}", err));
265 throw PackageManagerErrorFactory.GetException(err, "Failed to clear all cache directories");
270 /// Clears the application's internal and external data directories
273 /// All files under data, shared/data and shared/trusted in the internal storage are removed.
274 /// And, If external storeage exists, then all files under data and shared/trusted in the external storage are removed.
276 /// <param name="packageId">Id of the package</param>
277 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
278 /// <exception cref="System.IO.IOException">Thrown when method failed due to internal IO error</exception>
279 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
280 /// <exception cref="SystemException">Thrown when method failed due to internal system error</exception>
281 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
282 public static void ClearDataDirectory(string packageId)
284 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerClearDataDir(packageId);
285 if (err != Interop.PackageManager.ErrorCode.None)
287 Log.Warn(LogTag, string.Format("Failed to clear data directory for {0}. err = {1}", packageId, err));
288 throw PackageManagerErrorFactory.GetException(err, "Failed to clear data directory");
293 /// Retrieves package information of all installed packages.
295 /// <returns>Returns the list of packages.</returns>
296 /// <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
297 public static IEnumerable<Package> GetPackages()
299 return GetPackages(null);
303 /// Retrieves package information of all installed packages satisfying filter conditions.
305 /// <param name="filter">Optional - package filters</param>
306 /// <returns>Returns the list of packages.</returns>
307 /// <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
308 public static IEnumerable<Package> GetPackages(PackageFilter filter)
310 List<Package> packageList = new List<Package>();
313 var err = Interop.PackageManager.PackageManagerFilterCreate(out filterHandle);
314 if (err != Interop.PackageManager.ErrorCode.None)
316 Log.Warn(LogTag, string.Format("Failed to create package filter handle. err = {0}", err));
320 if (filter != null && filter.Filters != null)
322 foreach (KeyValuePair<string, bool> entry in filter?.Filters)
324 err = Interop.PackageManager.PackageManagerFilterAdd(filterHandle, entry.Key, entry.Value);
325 if (err != Interop.PackageManager.ErrorCode.None)
327 Log.Warn(LogTag, string.Format("Failed to configure package filter. err = {0}", err));
333 if (err == Interop.PackageManager.ErrorCode.None)
335 Interop.PackageManager.PackageManagerPackageInfoCallback cb = (handle, userData) =>
337 packageList.Add(Package.GetPackage(handle));
341 err = Interop.PackageManager.PackageManagerFilterForeachPackageInfo(filterHandle, cb, IntPtr.Zero);
342 if (err != Interop.PackageManager.ErrorCode.None)
344 Log.Warn(LogTag, string.Format("Failed to get package Informations. err = {0}", err));
348 err = Interop.PackageManager.PackageManagerFilterDestroy(filterHandle);
349 if (err != Interop.PackageManager.ErrorCode.None)
351 Log.Warn(LogTag, string.Format("Failed to destroy package filter handle. err = {0}", err));
357 /// Gets the total package size information.
359 /// <returns>Returns the total package size information asynchronously.</returns>
360 /// <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
361 public static async Task<PackageSizeInformation> GetTotalSizeInformationAsync()
363 TaskCompletionSource<PackageSizeInformation> tcs = new TaskCompletionSource<PackageSizeInformation>();
364 Interop.PackageManager.PackageManagerTotalSizeInfoCallback cb = (handle, userData) =>
366 if (handle != IntPtr.Zero)
368 tcs.TrySetResult(PackageSizeInformation.GetPackageSizeInformation(handle));
372 var err = Interop.PackageManager.PackageManagerGetTotalSizeInfo(cb, IntPtr.Zero);
373 if (err != Interop.PackageManager.ErrorCode.None)
375 tcs.TrySetException(PackageManagerErrorFactory.GetException(err, "Failed to get total package size info"));
377 return await tcs.Task.ConfigureAwait(false);
381 /// Installs package located at the given path
383 /// <param name="packagePath">Absolute path for the package to be installed</param>
384 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
386 /// The 'true' means that just the request of installation is seccessful.
387 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event.
389 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
390 public static bool Install(string packagePath)
392 return Install(packagePath, null, PackageType.UNKNOWN, null);
396 /// Installs package located at the given path
398 /// <param name="packagePath">Absolute path for the package to be installed</param>
399 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
400 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
402 /// The 'true' means that just the request of installation is seccessful.
403 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event OR eventCallback.
405 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
406 public static bool Install(string packagePath, RequestEventCallback eventCallback)
408 return Install(packagePath, null, PackageType.UNKNOWN, eventCallback);
412 /// Installs package located at the given path
414 /// <param name="packagePath">Absolute path for the package to be installed</param>
415 /// <param name="type">Optional - Package type for the package to be installed</param>
416 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
418 /// The 'true' means that just the request of installation is seccessful.
419 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event.
421 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
422 public static bool Install(string packagePath, PackageType type)
424 return Install(packagePath, null, type, null);
428 /// Installs package located at the given path
430 /// <param name="packagePath">Absolute path for the package to be installed</param>
431 /// <param name="expansionPackagePath">Optional - Absolute path for the expansion package to be installed</param>
432 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
434 /// The 'true' means that just the request of installation is seccessful.
435 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event.
437 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
438 public static bool Install(string packagePath, string expansionPackagePath)
440 return Install(packagePath, expansionPackagePath, PackageType.UNKNOWN, null);
444 /// Installs package located at the given path
446 /// <param name="packagePath">Absolute path for the package to be installed</param>
447 /// <param name="type">Optional - Package type for the package to be installed</param>
448 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
449 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
451 /// The 'true' means that just the request of installation is seccessful.
452 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event OR eventCallback.
454 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
455 public static bool Install(string packagePath, PackageType type, RequestEventCallback eventCallback)
457 return Install(packagePath, null, type, eventCallback);
461 /// Installs package located at the given path
463 /// <param name="packagePath">Absolute path for the package to be installed</param>
464 /// <param name="expansionPackagePath">Optional - Absolute path for the expansion package to be installed</param>
465 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
466 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
468 /// The 'true' means that just the request of installation is seccessful.
469 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event OR eventCallback.
471 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
472 public static bool Install(string packagePath, string expansionPackagePath, RequestEventCallback eventCallback)
474 return Install(packagePath, expansionPackagePath, PackageType.UNKNOWN, eventCallback);
478 /// Installs package located at the given path
480 /// <param name="packagePath">Absolute path for the package to be installed</param>
481 /// <param name="expansionPackagePath">Optional - Absolute path for the expansion package to be installed</param>
482 /// <param name="type">Optional - Package type for the package to be installed</param>
483 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
485 /// The 'true' means that just the request of installation is seccessful.
486 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event.
488 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
489 public static bool Install(string packagePath, string expansionPackagePath, PackageType type)
491 return Install(packagePath, expansionPackagePath, type, null);
495 /// Installs package located at the given path
497 /// <param name="packagePath">Absolute path for the package to be installed</param>
498 /// <param name="expansionPackagePath">Optional - Absolute path for the expansion package to be installed</param>
499 /// <param name="type">Optional - Package type for the package to be installed</param>
500 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
501 /// <returns>Returns true if installtion request is successful, false otherwise.</returns>
503 /// The 'true' means that just the request of installation is seccessful.
504 /// To check the result of installation, the caller should check the progress using InstallProgressChanged event OR eventCallback.
506 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
507 public static bool Install(string packagePath, string expansionPackagePath, PackageType type, RequestEventCallback eventCallback)
509 SafePackageManagerRequestHandle RequestHandle;
510 var err = Interop.PackageManager.PackageManagerRequestCreate(out RequestHandle);
511 if (err != Interop.PackageManager.ErrorCode.None)
513 Log.Warn(LogTag, string.Format("Failed to install package {0}. Error in creating package manager request handle. err = {1}", packagePath, err));
519 if (type != PackageType.UNKNOWN)
521 err = Interop.PackageManager.PackageManagerRequestSetType(RequestHandle, type.ToString().ToLower());
522 if (err != Interop.PackageManager.ErrorCode.None)
524 Log.Warn(LogTag, string.Format("Failed to install package {0}. Error in setting request package type. err = {1}", packagePath, err));
525 RequestHandle.Dispose();
530 if (!string.IsNullOrEmpty(expansionPackagePath))
532 err = Interop.PackageManager.PackageManagerRequestSetTepPath(RequestHandle, expansionPackagePath);
533 if (err != Interop.PackageManager.ErrorCode.None)
535 Log.Warn(LogTag, string.Format("Failed to install package {0}. Error in setting request package mode. err = {1}", packagePath, err));
536 RequestHandle.Dispose();
542 if (eventCallback != null)
544 err = Interop.PackageManager.PackageManagerRequestInstallWithCB(RequestHandle, packagePath, internalRequestEventCallback, IntPtr.Zero, out requestId);
545 if (err == Interop.PackageManager.ErrorCode.None)
547 RequestCallbacks.Add(requestId, eventCallback);
548 RequestHandles.Add(requestId, RequestHandle);
552 Log.Warn(LogTag, string.Format("Failed to install package {0}. err = {1}", packagePath, err));
553 RequestHandle.Dispose();
559 err = Interop.PackageManager.PackageManagerRequestInstall(RequestHandle, packagePath, out requestId);
560 if (err != Interop.PackageManager.ErrorCode.None)
562 Log.Warn(LogTag, string.Format("Failed to install package {0}. err = {1}", packagePath, err));
563 RequestHandle.Dispose();
566 // RequestHandle isn't necessary when this method is called without 'eventCallback' parameter.
567 RequestHandle.Dispose();
573 Log.Warn(LogTag, e.Message);
574 RequestHandle.Dispose();
580 /// Uninstalls package with the given name.
582 /// <param name="packageId">Id of the package to be uninstalled</param>
583 /// <returns>Returns true if uninstallation request is successful, false otherwise.</returns>
585 /// The 'true' means that just the request of uninstallation is seccessful.
586 /// To check the result of uninstallation, the caller should check the progress using UninstallProgressChanged event.
588 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
589 public static bool Uninstall(string packageId)
591 return Uninstall(packageId, PackageType.UNKNOWN, null);
595 /// Uninstalls package with the given name.
597 /// <param name="packageId">Id of the package to be uninstalled</param>
598 /// <param name="type">Optional - Package type for the package to be uninstalled</param>
599 /// <returns>Returns true if uninstalltion request is successful, false otherwise.</returns>
601 /// The 'true' means that just the request of uninstallation is seccessful.
602 /// To check the result of uninstallation, the caller should check the progress using UninstallProgressChanged event.
604 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
605 public static bool Uninstall(string packageId, PackageType type)
607 return Uninstall(packageId, type, null);
611 /// Uninstalls package with the given name.
613 /// <param name="packageId">Id of the package to be uninstalled</param>
614 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
615 /// <returns>Returns true if uninstalltion request is successful, false otherwise.</returns>
617 /// The 'true' means that just the request of uninstallation is seccessful.
618 /// To check the result of uninstallation, the caller should check the progress using UninstallProgressChanged event OR eventCallback.
620 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
621 public static bool Uninstall(string packageId, RequestEventCallback eventCallback)
623 return Uninstall(packageId, PackageType.UNKNOWN, eventCallback);
627 /// Uninstalls package with the given name.
629 /// <param name="packageId">Id of the package to be uninstalled</param>
630 /// <param name="type">Optional - Package type for the package to be uninstalled</param>
631 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
632 /// <returns>Returns true if uninstalltion request is successful, false otherwise.</returns>
634 /// The 'true' means that just the request of uninstallation is seccessful.
635 /// To check the result of uninstallation, the caller should check the progress using UninstallProgressChanged event OR eventCallback.
637 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
638 public static bool Uninstall(string packageId, PackageType type, RequestEventCallback eventCallback)
640 SafePackageManagerRequestHandle RequestHandle;
641 var err = Interop.PackageManager.PackageManagerRequestCreate(out RequestHandle);
642 if (err != Interop.PackageManager.ErrorCode.None)
644 Log.Warn(LogTag, string.Format("Failed to uninstall package {0}. Error in creating package manager request handle. err = {1}", packageId, err));
650 err = Interop.PackageManager.PackageManagerRequestSetType(RequestHandle, type.ToString().ToLower());
651 if (err != Interop.PackageManager.ErrorCode.None)
653 Log.Warn(LogTag, string.Format("Failed to uninstall package {0}. Error in setting request package type. err = {1}", packageId, err));
654 RequestHandle.Dispose();
659 if (eventCallback != null)
661 err = Interop.PackageManager.PackageManagerRequestUninstallWithCB(RequestHandle, packageId, internalRequestEventCallback, IntPtr.Zero, out requestId);
662 if (err == Interop.PackageManager.ErrorCode.None)
664 RequestCallbacks.Add(requestId, eventCallback);
665 RequestHandles.Add(requestId, RequestHandle);
669 Log.Warn(LogTag, string.Format("Failed to uninstall package {0}. err = {1}", packageId, err));
670 RequestHandle.Dispose();
676 err = Interop.PackageManager.PackageManagerRequestUninstall(RequestHandle, packageId, out requestId);
677 if (err != Interop.PackageManager.ErrorCode.None)
679 Log.Warn(LogTag, string.Format("Failed to uninstall package. err = {0}", err));
680 RequestHandle.Dispose();
683 // RequestHandle isn't necessary when this method is called without 'eventCallback' parameter.
684 RequestHandle.Dispose();
690 Log.Warn(LogTag, e.Message);
691 RequestHandle.Dispose();
697 /// Move package to given storage.
699 /// <param name="packageId">Id of the package to be moved</param>
700 /// <param name="newStorage">Storage, package should be moved to</param>
701 /// <returns>Returns true if move request is successful, false otherwise.</returns>
703 /// The 'true' means that just the request of move is seccessful.
704 /// To check the result of move, the caller should check the progress using MoveProgressChanged event.
706 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
707 public static bool Move(string packageId, StorageType newStorage)
709 return Move(packageId, PackageType.UNKNOWN, newStorage, null);
713 /// Move package to given storage.
715 /// <param name="packageId">Id of the package to be moved</param>
716 /// <param name="type">Optional - Package type for the package to be moved</param>
717 /// <param name="newStorage">Storage, package should be moved to</param>
718 /// <returns>Returns true if move request is successful, false otherwise.</returns>
720 /// The 'true' means that just the request of move is seccessful.
721 /// To check the result of move, the caller should check the progress using MoveProgressChanged event.
723 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
724 public static bool Move(string packageId, PackageType type, StorageType newStorage)
726 return Move(packageId, type, newStorage, null);
730 /// Move package to given storage.
732 /// <param name="packageId">Id of the package to be moved</param>
733 /// <param name="newStorage">Storage, package should be moved to</param>
734 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
735 /// <returns>Returns true if move request is successful, false otherwise.</returns>
737 /// The 'true' means that just the request of move is seccessful.
738 /// To check the result of move, the caller should check the progress using MoveProgressChanged event.
740 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
741 public static bool Move(string packageId, StorageType newStorage, RequestEventCallback eventCallback)
743 return Move(packageId, PackageType.UNKNOWN, newStorage, eventCallback);
747 /// Move package to given storage.
749 /// <param name="packageId">Id of the package to be moved</param>
750 /// <param name="type">Optional - Package type for the package to be moved</param>
751 /// <param name="newStorage">Storage, package should be moved to</param>
752 /// <param name="eventCallback">Optional - The event callback will be invoked only for the current request</param>
753 /// <returns>Returns true if move request is successful, false otherwise.</returns>
755 /// The 'true' means that just the request of move is seccessful.
756 /// To check the result of move, the caller should check the progress using MoveProgressChanged event.
758 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
759 public static bool Move(string packageId, PackageType type, StorageType newStorage, RequestEventCallback eventCallback)
761 SafePackageManagerRequestHandle RequestHandle;
762 var err = Interop.PackageManager.PackageManagerRequestCreate(out RequestHandle);
763 if (err != Interop.PackageManager.ErrorCode.None)
765 Log.Warn(LogTag, string.Format("Failed to create package manager request handle. err = {0}", err));
772 err = Interop.PackageManager.PackageManagerRequestSetType(RequestHandle, type.ToString().ToLower());
773 if (err != Interop.PackageManager.ErrorCode.None)
775 Log.Warn(LogTag, string.Format("Failed to move package. Error in setting request package type. err = {0}", err));
776 RequestHandle.Dispose();
780 if (eventCallback != null)
783 err = Interop.PackageManager.PackageManagerRequestMoveWithCB(RequestHandle, packageId, (Interop.PackageManager.StorageType)newStorage, internalRequestEventCallback, IntPtr.Zero, out requestId);
784 if (err == Interop.PackageManager.ErrorCode.None)
786 RequestCallbacks.Add(requestId, eventCallback);
787 RequestHandles.Add(requestId, RequestHandle);
791 Log.Warn(LogTag, string.Format("Failed to move package to requested location. err = {0}", err));
792 RequestHandle.Dispose();
798 err = Interop.PackageManager.PackageManagerRequestMove(RequestHandle, packageId, (Interop.PackageManager.StorageType)newStorage);
799 if (err != Interop.PackageManager.ErrorCode.None)
801 Log.Warn(LogTag, string.Format("Failed to move package to requested location. err = {0}", err));
802 RequestHandle.Dispose();
805 // RequestHandle isn't necessary when this method is called without 'eventCallback' parameter.
806 RequestHandle.Dispose();
812 Log.Warn(LogTag, e.Message);
813 RequestHandle.Dispose();
819 /// Gets permission type of package which has given application id
821 /// <param name="applicationId">Id of the application</param>
822 /// <returns>Returns permission type.</returns>
823 /// <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
824 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
825 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
826 public static PermissionType GetPermissionTypeByApplicationId(string applicationId)
828 Interop.PackageManager.PackageManagerPermissionType permissionType;
829 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerGetPermissionType(applicationId, out permissionType);
830 if (err != Interop.PackageManager.ErrorCode.None)
832 throw PackageManagerErrorFactory.GetException(err, "Failed to get permission type.");
835 return (PermissionType)permissionType;
839 /// Gets package's preload attribute which contain given applicion id
841 /// <param name="applicationId">Id of the application</param>
842 /// <returns>Returns true if package is preloaded. Otherwise return false.</returns>
843 /// <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
844 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
845 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
846 public static bool IsPreloadPackageByApplicationId(string applicationId)
848 bool isPreloadPackage;
849 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerIsPreloadPackageByApplicationId(applicationId, out isPreloadPackage);
850 if (err != Interop.PackageManager.ErrorCode.None)
852 throw PackageManagerErrorFactory.GetException(err, "Failed to get preload info");
855 return isPreloadPackage;
859 /// Compare certificate of two packages
861 /// <param name="lhsPackageId">package id to compare</param>
862 /// <param name="rhsPackageId">package id to be compared</param>
863 /// <returns>Returns certificate comparison result.</returns>
864 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
865 /// <exception cref="System.IO.IOException">Thrown when method failed due to internal IO error</exception>
866 public static CertCompareResultType CompareCertInfo(string lhsPackageId, string rhsPackageId)
868 Interop.PackageManager.CertCompareResultType compareResult;
869 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerCompareCertInfo(lhsPackageId, rhsPackageId, out compareResult);
870 if (err != Interop.PackageManager.ErrorCode.None)
872 throw PackageManagerErrorFactory.GetException(err, "Failed to compare cert info");
875 return (CertCompareResultType)compareResult;
879 /// Compare certificate of two packages which contain each given application id
881 /// <param name="lhsApplicationId">application id to compare</param>
882 /// <param name="rhsApplicationId">application id to be compared</param>
883 /// <returns>Returns certificate comparison result.</returns>
884 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
885 /// <exception cref="System.IO.IOException">Thrown when method failed due to internal IO error</exception>
886 public static CertCompareResultType CompareCertInfoByApplicationId(string lhsApplicationId, string rhsApplicationId)
888 Interop.PackageManager.CertCompareResultType compareResult;
889 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerCompareCertInfoByApplicationId(lhsApplicationId, rhsApplicationId, out compareResult);
890 if (err != Interop.PackageManager.ErrorCode.None)
892 throw PackageManagerErrorFactory.GetException(err, "Failed to compare cert info by application id");
895 return (CertCompareResultType)compareResult;
899 /// Drm nested class. This class has the PackageManager's drm related methods.
901 public static class Drm
904 /// Generates request for getting license
906 /// <param name="responseData">Response data string of the purchase request</param>
907 /// <returns>Returns package drm information of given response data which contains require data and license url</returns>
908 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
909 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
910 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
911 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
912 /// <exception cref="SystemException">Thrown when method failed due to internal system error</exception>
913 public static PackageDrm GenerateLicenseRequest(string responseData)
915 return PackageDrm.GenerateLicenseRequest(responseData);
920 /// Registers encrypted license
922 /// <param name="responseData">The response data string of the rights request</param>
923 /// <returns>Returns true if succeed. Otherwise return false</returns>
924 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
925 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
926 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
927 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
928 /// <exception cref="SystemException">Thrown when method failed due to internal system error</exception>
929 public static bool RegisterLicense(string responseData)
931 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerDrmRegisterLicense(responseData);
932 if (err != Interop.PackageManager.ErrorCode.None)
934 throw PackageManagerErrorFactory.GetException(err, "Failed to register drm license");
941 /// Decrypts contents which is encrypted
943 /// <param name="drmFilePath">Drm file path</param>
944 /// <param name="decryptedFilePath">Decrypted file path</param>
945 /// <returns>Returns true if succeed. Otherwise return false</returns>
946 /// <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
947 /// <exception cref="ArgumentException">Thrown when failed when input package ID is invalid</exception>
948 /// <exception cref="OutOfMemoryException">Thrown when there is not enough memory to continue the execution of the method</exception>
949 /// <exception cref="UnauthorizedAccessException">Thrown when app does not have privilege to access this method</exception>
950 /// <exception cref="SystemException">Thrown when method failed due to internal system error</exception>
951 public static bool DecryptPackage(string drmFilePath, string decryptedFilePath)
953 Interop.PackageManager.ErrorCode err = Interop.PackageManager.PackageManagerDrmDecryptPackage(drmFilePath, decryptedFilePath);
954 if (err != Interop.PackageManager.ErrorCode.None)
956 throw PackageManagerErrorFactory.GetException(err, "Failed to decrypt drm package");
963 private static void SetPackageManagerEventStatus(Interop.PackageManager.EventStatus status)
965 if (Handle.IsInvalid) return;
967 Interop.PackageManager.EventStatus eventStatus = s_eventStatus;
968 eventStatus |= status;
969 if (eventStatus != Interop.PackageManager.EventStatus.All)
970 eventStatus |= Interop.PackageManager.EventStatus.Progress;
972 var err = Interop.PackageManager.ErrorCode.None;
973 if (s_eventStatus != eventStatus)
975 err = Interop.PackageManager.PackageManagerSetEvenStatus(Handle, eventStatus);
976 if (err == Interop.PackageManager.ErrorCode.None)
978 s_eventStatus = eventStatus;
979 Log.Debug(LogTag, string.Format("New Event Status flag: {0}", s_eventStatus));
982 Log.Debug(LogTag, string.Format("Failed to set flag for {0} event. err = {1}", eventStatus, err));
986 private static void UnsetPackageManagerEventStatus()
988 if (Handle.IsInvalid) return;
990 Interop.PackageManager.EventStatus eventStatus = Interop.PackageManager.EventStatus.All;
991 if (s_installEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.Install;
992 if (s_uninstallEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.Uninstall;
993 if (s_updateEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.Upgrade;
994 if (s_moveEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.Move;
995 if (s_clearDataEventHandler != null) eventStatus |= Interop.PackageManager.EventStatus.ClearData;
996 if (eventStatus != Interop.PackageManager.EventStatus.All)
997 eventStatus |= Interop.PackageManager.EventStatus.Progress;
999 var err = Interop.PackageManager.ErrorCode.None;
1000 if (s_eventStatus != eventStatus)
1002 err = Interop.PackageManager.PackageManagerSetEvenStatus(Handle, eventStatus);
1003 if (err == Interop.PackageManager.ErrorCode.None)
1005 s_eventStatus = eventStatus;
1006 Log.Debug(LogTag, string.Format("New Event Status flag: {0}", s_eventStatus));
1009 Log.Debug(LogTag, string.Format("Failed to set flag for {0} event. err = {1}", eventStatus, err));
1013 private static void RegisterPackageManagerEventIfNeeded()
1015 if (s_installEventHandler != null && s_uninstallEventHandler != null && s_updateEventHandler != null && s_moveEventHandler != null && s_clearDataEventHandler != null)
1020 var err = Interop.PackageManager.ErrorCode.None;
1021 s_packageManagerEventCallback = (packageType, packageId, eventType, eventState, progress, error, user_data) =>
1025 if (eventType == Interop.PackageManager.EventType.Install)
1027 s_installEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
1029 else if (eventType == Interop.PackageManager.EventType.Uninstall)
1031 s_uninstallEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
1033 else if (eventType == Interop.PackageManager.EventType.Update)
1035 s_updateEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
1037 else if (eventType == Interop.PackageManager.EventType.Move)
1039 s_moveEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
1041 else if (eventType == Interop.PackageManager.EventType.ClearData)
1043 s_clearDataEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
1048 Log.Warn(LogTag, e.Message);
1052 if (!Handle.IsInvalid)
1054 Log.Debug(LogTag, "Reset Package Event");
1055 err = Interop.PackageManager.PackageManagerUnsetEvent(Handle);
1056 if (err != Interop.PackageManager.ErrorCode.None)
1058 throw PackageManagerErrorFactory.GetException(err, "Failed to unregister package manager event event.");
1061 err = Interop.PackageManager.PackageManagerSetEvent(Handle, s_packageManagerEventCallback, IntPtr.Zero);
1063 if (err != Interop.PackageManager.ErrorCode.None)
1065 Log.Warn(LogTag, string.Format("Failed to register callback for package manager event. err = {0}", err));
1069 private static void UnregisterPackageManagerEventIfNeeded()
1071 if (Handle.IsInvalid || s_installEventHandler != null || s_uninstallEventHandler != null || s_updateEventHandler != null || s_moveEventHandler != null || s_clearDataEventHandler != null)
1076 var err = Interop.PackageManager.PackageManagerUnsetEvent(Handle);
1077 if (err != Interop.PackageManager.ErrorCode.None)
1079 throw PackageManagerErrorFactory.GetException(err, "Failed to unregister package manager event event.");
1084 internal static class PackageManagerErrorFactory
1086 internal static Exception GetException(Interop.PackageManager.ErrorCode err, string message)
1088 string errMessage = string.Format("{0} err = {1}", message, err);
1091 case Interop.PackageManager.ErrorCode.InvalidParameter:
1092 case Interop.PackageManager.ErrorCode.NoSuchPackage:
1093 return new ArgumentException(errMessage);
1094 case Interop.PackageManager.ErrorCode.PermissionDenied:
1095 return new UnauthorizedAccessException(errMessage);
1096 case Interop.PackageManager.ErrorCode.IoError:
1097 return new global::System.IO.IOException(errMessage);
1099 return new InvalidOperationException(errMessage);