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.ComponentModel;
20 using System.Runtime.InteropServices;
21 using System.Threading.Tasks;
22 using static Interop.ApplicationManager;
24 namespace Tizen.Applications
27 /// This class has the methods and events of the ApplicationManager.
29 /// <since_tizen> 3 </since_tizen>
30 public static class ApplicationManager
32 private const string LogTag = "Tizen.Applications";
33 private static EventHandler<ApplicationLaunchedEventArgs> s_launchedHandler;
34 private static EventHandler<ApplicationTerminatedEventArgs> s_terminatedHandler;
35 private static Interop.ApplicationManager.AppManagerAppContextEventCallback s_applicationChangedEventCallback;
36 private static EventHandler<ApplicationEnabledEventArgs> s_enabledHandler;
37 private static EventHandler<ApplicationDisabledEventArgs> s_disabledHandler;
38 private static Interop.ApplicationManager.AppManagerEventCallback s_eventCallback;
39 private static IntPtr _eventHandle = IntPtr.Zero;
40 private static readonly object s_eventLock = new object();
41 private static readonly object s_applicationChangedEventLock = new object();
44 /// Occurs whenever the installed application is enabled.
46 /// <since_tizen> 3 </since_tizen>
47 public static event EventHandler<ApplicationEnabledEventArgs> ApplicationEnabled
53 if (s_eventCallback == null)
55 RegisterApplicationEvent();
57 s_enabledHandler += value;
64 s_enabledHandler -= value;
65 if (s_enabledHandler == null && s_disabledHandler == null && s_eventCallback != null)
67 UnRegisterApplicationEvent();
68 s_eventCallback = null;
75 /// Occurs whenever the installed application is disabled.
77 /// <since_tizen> 3 </since_tizen>
78 public static event EventHandler<ApplicationDisabledEventArgs> ApplicationDisabled
84 if (s_eventCallback == null)
86 RegisterApplicationEvent();
88 s_disabledHandler += value;
95 s_disabledHandler -= value;
96 if (s_enabledHandler == null && s_disabledHandler == null && s_eventCallback != null)
98 UnRegisterApplicationEvent();
99 s_eventCallback = null;
106 /// Occurs whenever the installed applications get launched.
108 /// <since_tizen> 3 </since_tizen>
109 public static event EventHandler<ApplicationLaunchedEventArgs> ApplicationLaunched
113 lock (s_applicationChangedEventLock)
115 if (s_applicationChangedEventCallback == null)
117 RegisterApplicationChangedEvent();
119 s_launchedHandler += value;
124 lock (s_applicationChangedEventLock)
126 s_launchedHandler -= value;
127 if (s_launchedHandler == null && s_terminatedHandler == null && s_applicationChangedEventCallback != null)
129 UnRegisterApplicationChangedEvent();
130 s_applicationChangedEventCallback = null;
137 /// Occurs whenever the installed applications get terminated.
139 /// <since_tizen> 3 </since_tizen>
140 public static event EventHandler<ApplicationTerminatedEventArgs> ApplicationTerminated
144 lock (s_applicationChangedEventLock)
146 if (s_applicationChangedEventCallback == null)
148 RegisterApplicationChangedEvent();
150 s_terminatedHandler += value;
155 lock (s_applicationChangedEventLock)
157 s_terminatedHandler -= value;
158 if (s_launchedHandler == null && s_terminatedHandler == null && s_applicationChangedEventCallback != null)
160 UnRegisterApplicationChangedEvent();
161 s_applicationChangedEventCallback = null;
168 /// Gets the information of the installed applications asynchronously.
170 /// <returns>The installed application info list.</returns>
171 /// <since_tizen> 3 </since_tizen>
172 public static async Task<IEnumerable<ApplicationInfo>> GetInstalledApplicationsAsync()
174 return await Task.Run(() =>
176 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
177 List<ApplicationInfo> result = new List<ApplicationInfo>();
179 Interop.ApplicationManager.AppManagerAppInfoCallback cb = (IntPtr infoHandle, IntPtr userData) =>
181 if (infoHandle != IntPtr.Zero)
183 IntPtr clonedHandle = IntPtr.Zero;
184 err = Interop.ApplicationManager.AppInfoClone(out clonedHandle, infoHandle);
185 if (err != Interop.ApplicationManager.ErrorCode.None)
187 Log.Warn(LogTag, "Failed to clone the appinfo. err = " + err);
190 ApplicationInfo app = new ApplicationInfo(clonedHandle);
196 err = Interop.ApplicationManager.AppManagerForeachAppInfo(cb, IntPtr.Zero);
197 if (err != Interop.ApplicationManager.ErrorCode.None)
199 Log.Error(LogTag, "Failed to retrieve the application Info. err " + err.ToString());
202 }).ConfigureAwait(false);
206 /// Terminates the application if it is running on background.
208 /// <param name="app">ApplicationRunningContext object</param>
209 /// <exception cref="ArgumentException">Thrown when failed of invalid argument.</exception>
210 /// <exception cref="UnauthorizedAccessException">Thrown when failed because of permission denied.</exception>
211 /// <exception cref="InvalidOperationException">Thrown when failed because of system error.</exception>
212 /// <privilege>http://tizen.org/privilege/appmanager.kill.bgapp</privilege>
214 /// This function returns after it just sends a request for terminating a background application.
215 /// Platform will decide if the target application could be terminated or not according to the state of the target application.
217 /// <since_tizen> 6 </since_tizen>
218 public static void TerminateBackgroundApplication(ApplicationRunningContext app)
220 ErrorCode err = Interop.ApplicationManager.AppManagerRequestTerminateBgApp(app._contextHandle);
221 if (err != Interop.ApplicationManager.ErrorCode.None)
225 case Interop.ApplicationManager.ErrorCode.InvalidParameter:
226 throw new ArgumentException("Invalid argument.");
227 case Interop.ApplicationManager.ErrorCode.PermissionDenied:
228 throw new UnauthorizedAccessException("Permission denied.");
230 throw new InvalidOperationException("Invalid Operation.");
236 /// Gets the information of the installed applications with the ApplicationInfoFilter asynchronously.
238 /// <param name="filter">Key-value pairs for filtering.</param>
239 /// <returns>The installed application info list.</returns>
240 /// <since_tizen> 3 </since_tizen>
241 public static async Task<IEnumerable<ApplicationInfo>> GetInstalledApplicationsAsync(ApplicationInfoFilter filter)
243 return await Task.Run(() =>
245 List<ApplicationInfo> result = new List<ApplicationInfo>();
247 Interop.ApplicationManager.AppInfoFilterCallback cb = (IntPtr infoHandle, IntPtr userData) =>
249 if (infoHandle != IntPtr.Zero)
251 IntPtr clonedHandle = IntPtr.Zero;
252 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppInfoClone(out clonedHandle, infoHandle);
253 if (err != Interop.ApplicationManager.ErrorCode.None)
255 Log.Warn(LogTag, "Failed to clone the appinfo. err = " + err);
258 ApplicationInfo app = new ApplicationInfo(clonedHandle);
269 catch (InvalidOperationException)
271 Log.Error(LogTag, "InvalidOperationException occurs");
273 catch (ArgumentException)
275 Log.Error(LogTag, "ArgumentException occurs");
279 }).ConfigureAwait(false);
283 /// Gets the information of the installed applications with the ApplicationInfoMetadataFilter asynchronously.
285 /// <param name="filter">Key-value pairs for filtering.</param>
286 /// <returns>The installed application info list.</returns>
287 /// <since_tizen> 3 </since_tizen>
288 public static async Task<IEnumerable<ApplicationInfo>> GetInstalledApplicationsAsync(ApplicationInfoMetadataFilter filter)
290 return await Task.Run(() =>
292 List<ApplicationInfo> result = new List<ApplicationInfo>();
294 Interop.ApplicationManager.AppInfoFilterCallback cb = (IntPtr infoHandle, IntPtr userData) =>
296 if (infoHandle != IntPtr.Zero)
298 IntPtr clonedHandle = IntPtr.Zero;
299 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppInfoClone(out clonedHandle, infoHandle);
300 if (err != Interop.ApplicationManager.ErrorCode.None)
302 Log.Warn(LogTag, "Failed to clone the appinfo. err = " + err);
305 ApplicationInfo app = new ApplicationInfo(clonedHandle);
316 catch (InvalidOperationException)
318 Log.Error(LogTag, "InvalidOperationException occurs");
320 catch (ArgumentException)
322 Log.Error(LogTag, "ArgumentException occurs");
326 }).ConfigureAwait(false);
330 /// Gets the information of the running applications asynchronously.
332 /// <returns>The application running context list.</returns>
333 /// <since_tizen> 3 </since_tizen>
334 public static async Task<IEnumerable<ApplicationRunningContext>> GetRunningApplicationsAsync()
336 return await Task.Run(() =>
338 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
339 List<ApplicationRunningContext> result = new List<ApplicationRunningContext>();
341 Interop.ApplicationManager.AppManagerAppContextCallback cb = (IntPtr contextHandle, IntPtr userData) =>
343 if (contextHandle != IntPtr.Zero)
345 IntPtr clonedHandle = IntPtr.Zero;
346 err = Interop.ApplicationManager.AppContextClone(out clonedHandle, contextHandle);
347 if (err != Interop.ApplicationManager.ErrorCode.None)
349 Log.Warn(LogTag, "Failed to clone the app context. err = " + err);
352 ApplicationRunningContext context = new ApplicationRunningContext(clonedHandle);
359 err = Interop.ApplicationManager.AppManagerForeachAppContext(cb, IntPtr.Zero);
360 if (err != Interop.ApplicationManager.ErrorCode.None)
362 Log.Error(LogTag, "Failed to retrieve the running app context. err " + err.ToString());
365 }).ConfigureAwait(false);
369 /// Gets the information of the running applications including subapp asynchronously.
371 /// <returns>The application running context list.</returns>
372 /// <since_tizen> 3 </since_tizen>
373 public static async Task<IEnumerable<ApplicationRunningContext>> GetAllRunningApplicationsAsync()
375 return await Task.Run(() =>
377 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
378 List<ApplicationRunningContext> result = new List<ApplicationRunningContext>();
380 Interop.ApplicationManager.AppManagerAppContextCallback cb = (IntPtr contextHandle, IntPtr userData) =>
382 if (contextHandle != IntPtr.Zero)
384 IntPtr clonedHandle = IntPtr.Zero;
385 err = Interop.ApplicationManager.AppContextClone(out clonedHandle, contextHandle);
386 if (err != Interop.ApplicationManager.ErrorCode.None)
388 Log.Warn(LogTag, "Failed to clone the app context. err = " + err);
391 ApplicationRunningContext context = new ApplicationRunningContext(clonedHandle);
398 err = Interop.ApplicationManager.AppManagerForeachRunningAppContext(cb, IntPtr.Zero);
399 if (err != Interop.ApplicationManager.ErrorCode.None)
401 Log.Error(LogTag, "Failed to retrieve the running app context. err " + err.ToString());
404 }).ConfigureAwait(false);
408 /// Gets the information of the specified application with the application ID.
410 /// <param name="applicationId">Application ID.</param>
411 /// <returns>The application info.</returns>
412 /// <since_tizen> 3 </since_tizen>
413 public static ApplicationInfo GetInstalledApplication(string applicationId)
415 IntPtr infoHandle = IntPtr.Zero;
416 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppManagerGetAppInfo(applicationId, out infoHandle);
417 if (err != Interop.ApplicationManager.ErrorCode.None)
419 throw ApplicationManagerErrorFactory.GetException(err, "Failed to get the installed application information of " + applicationId + ".");
421 ApplicationInfo app = new ApplicationInfo(infoHandle);
426 /// Returns if the specified application is running or not.
428 /// <param name="applicationId">The application ID.</param>
429 /// <returns>Returns true if the given application is running, otherwise false.</returns>
430 /// <exception cref="ArgumentException">Thrown when the given parameter is invalid.</exception>
431 /// <since_tizen> 3 </since_tizen>
432 public static bool IsRunning(string applicationId)
434 bool isRunning = false;
435 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppManagerIsRunning(applicationId, out isRunning);
436 if (err != Interop.ApplicationManager.ErrorCode.None)
438 throw ApplicationManagerErrorFactory.GetException(Interop.ApplicationManager.ErrorCode.InvalidParameter, "Invalid parameter");
444 /// Returns the application id.
446 /// <param name="processId">The application pid.</param>
447 /// <returns>Returns the application id.</returns>
448 /// <exception cref="ArgumentException">Thrown when the given parameter is invalid.</exception>
449 /// <since_tizen> 6 </since_tizen>
450 public static string GetAppId(int processId)
453 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppManagerGetAppId(processId, out appid);
454 if (err != Interop.ApplicationManager.ErrorCode.None)
456 throw ApplicationManagerErrorFactory.GetException(err, "fail to get appid(" + processId + ")");
461 private static void RegisterApplicationChangedEvent()
463 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
464 s_applicationChangedEventCallback = (IntPtr contextHandle, Interop.ApplicationManager.AppContextEvent state, IntPtr userData) =>
466 if (contextHandle == IntPtr.Zero) return;
468 IntPtr clonedHandle = IntPtr.Zero;
469 err = Interop.ApplicationManager.AppContextClone(out clonedHandle, contextHandle);
470 if (err != Interop.ApplicationManager.ErrorCode.None)
472 throw ApplicationManagerErrorFactory.GetException(err, "Failed to register the application context event.");
474 using (ApplicationRunningContext context = new ApplicationRunningContext(clonedHandle))
476 lock (s_applicationChangedEventLock)
478 if (state == Interop.ApplicationManager.AppContextEvent.Launched)
480 s_launchedHandler?.Invoke(null, new ApplicationLaunchedEventArgs { ApplicationRunningContext = context });
482 else if (state == Interop.ApplicationManager.AppContextEvent.Terminated)
484 s_terminatedHandler?.Invoke(null, new ApplicationTerminatedEventArgs { ApplicationRunningContext = context });
489 err = Interop.ApplicationManager.AppManagerSetAppContextEvent(s_applicationChangedEventCallback, IntPtr.Zero);
490 if (err != Interop.ApplicationManager.ErrorCode.None)
492 throw ApplicationManagerErrorFactory.GetException(err, "Failed to register the application context event.");
496 private static void UnRegisterApplicationChangedEvent()
498 Interop.ApplicationManager.AppManagerUnSetAppContextEvent();
501 private static void RegisterApplicationEvent()
503 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
504 err = Interop.ApplicationManager.AppManagerEventCreate(out _eventHandle);
505 if (err != Interop.ApplicationManager.ErrorCode.None)
507 throw ApplicationManagerErrorFactory.GetException(err, "Failed to create the application event handle");
510 err = Interop.ApplicationManager.AppManagerEventSetStatus(_eventHandle, Interop.ApplicationManager.AppManagerEventStatusType.All);
511 if (err != Interop.ApplicationManager.ErrorCode.None)
513 Interop.ApplicationManager.AppManagerEventDestroy(_eventHandle);
514 _eventHandle = IntPtr.Zero;
515 throw ApplicationManagerErrorFactory.GetException(err, "Failed to set the application event");
518 s_eventCallback = (string appType, string appId, Interop.ApplicationManager.AppManagerEventType eventType, Interop.ApplicationManager.AppManagerEventState eventState, IntPtr eventHandle, IntPtr UserData) =>
522 if (eventType == Interop.ApplicationManager.AppManagerEventType.Enable)
524 s_enabledHandler?.Invoke(null, new ApplicationEnabledEventArgs(appId, (ApplicationEventState)eventState));
526 else if (eventType == Interop.ApplicationManager.AppManagerEventType.Disable)
528 s_disabledHandler?.Invoke(null, new ApplicationDisabledEventArgs(appId, (ApplicationEventState)eventState));
532 err = Interop.ApplicationManager.AppManagerSetEventCallback(_eventHandle, s_eventCallback, IntPtr.Zero);
533 if (err != Interop.ApplicationManager.ErrorCode.None)
535 Interop.ApplicationManager.AppManagerEventDestroy(_eventHandle);
536 _eventHandle = IntPtr.Zero;
537 throw ApplicationManagerErrorFactory.GetException(err, "Failed to set the application event callback");
541 private static void UnRegisterApplicationEvent()
543 if (_eventHandle != IntPtr.Zero)
545 Interop.ApplicationManager.AppManagerUnSetEventCallback(_eventHandle);
546 Interop.ApplicationManager.AppManagerEventDestroy(_eventHandle);
547 _eventHandle = IntPtr.Zero;
552 /// Gets the information of the recent applications.
554 /// <returns>Returns a dictionary containing all the recent application info.</returns>
555 /// <exception cref="InvalidOperationException">Thrown when failed because of an invalid operation.</exception>
556 /// <since_tizen> 3 </since_tizen>
557 [EditorBrowsable(EditorBrowsableState.Never)]
558 public static IEnumerable<RecentApplicationInfo> GetRecentApplications()
560 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
562 List<RecentApplicationInfo> result = new List<RecentApplicationInfo>();
566 err = Interop.ApplicationManager.RuaHistoryLoadDb(out table, out nrows, out ncols);
567 if (err != Interop.ApplicationManager.ErrorCode.None)
569 throw ApplicationManagerErrorFactory.GetException(err, "Failed to load a table for the recent application list.");
572 for (int row = 0; row < nrows; ++row)
574 Interop.ApplicationManager.RuaRec record;
576 err = Interop.ApplicationManager.RuaHistoryGetRecord(out record, table, nrows, ncols, row);
577 if (err != Interop.ApplicationManager.ErrorCode.None)
579 throw ApplicationManagerErrorFactory.GetException(err, "Failed to get record.");
582 RecentApplicationInfo info = new RecentApplicationInfo(record);
586 err = Interop.ApplicationManager.RuaHistoryUnLoadDb(ref table);
587 if (err != Interop.ApplicationManager.ErrorCode.None)
589 throw ApplicationManagerErrorFactory.GetException(err, "Failed to unload a table for the recent application list.");
596 /// Attaches the window of the child application to the window of the parent application.
599 /// This method is only available for platform level signed applications.
601 /// <exception cref="ArgumentException">Thrown when failed of invalid argument.</exception>
602 /// <exception cref="UnauthorizedAccessException">Thrown when failed because of permission denied.</exception>
603 /// <exception cref="InvalidOperationException">Thrown when failed because of an invalid operation.</exception>
604 /// <since_tizen> 8 </since_tizen>
605 [EditorBrowsable(EditorBrowsableState.Never)]
606 public static void AttachWindow(string parentAppId, string childAppId)
608 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
610 err = Interop.ApplicationManager.AppManagerAttachWindow(parentAppId, childAppId);
611 if (err != Interop.ApplicationManager.ErrorCode.None)
615 case Interop.ApplicationManager.ErrorCode.InvalidParameter:
616 throw new ArgumentException("Invalid argument.");
617 case Interop.ApplicationManager.ErrorCode.PermissionDenied:
618 throw new UnauthorizedAccessException("Permission denied.");
619 case Interop.ApplicationManager.ErrorCode.IoError:
620 throw new InvalidOperationException("IO error at unmanaged code.");
621 case Interop.ApplicationManager.ErrorCode.OutOfMemory:
622 throw new InvalidOperationException("Out-of-memory at unmanaged code.");
623 case Interop.ApplicationManager.ErrorCode.NoSuchApp:
624 throw new InvalidOperationException("No such application.");
631 /// Detaches the window of the application from its parent window.
634 /// This method is only available for platform level signed applications.
636 /// <exception cref="ArgumentException">Thrown when failed of invalid argument.</exception>
637 /// <exception cref="UnauthorizedAccessException">Thrown when failed because of permission denied.</exception>
638 /// <exception cref="InvalidOperationException">Thrown when failed because of an invalid operation.</exception>
639 /// <since_tizen> 8 </since_tizen>
640 [EditorBrowsable(EditorBrowsableState.Never)]
641 public static void DetachWindow(string applicationId)
643 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
645 err = Interop.ApplicationManager.AppManagerDetachWindow(applicationId);
646 if (err != Interop.ApplicationManager.ErrorCode.None)
650 case Interop.ApplicationManager.ErrorCode.InvalidParameter:
651 throw new ArgumentException("Invalid argument.");
652 case Interop.ApplicationManager.ErrorCode.PermissionDenied:
653 throw new UnauthorizedAccessException("Permission denied.");
654 case Interop.ApplicationManager.ErrorCode.IoError:
655 throw new InvalidOperationException("IO error at unmanaged code.");
656 case Interop.ApplicationManager.ErrorCode.OutOfMemory:
657 throw new InvalidOperationException("Out-of-memory at unmanaged code.");
658 case Interop.ApplicationManager.ErrorCode.NoSuchApp:
659 throw new InvalidOperationException("No such application.");
665 /// Attaches the window of the child application below the window of the parent application.
668 /// This method is only available for platform level signed applications.
670 /// <exception cref="ArgumentException">Thrown when failed of invalid argument.</exception>
671 /// <exception cref="UnauthorizedAccessException">Thrown when failed because of permission denied.</exception>
672 /// <exception cref="InvalidOperationException">Thrown when failed because of an invalid operation.</exception>
673 /// <since_tizen> 9 </since_tizen>
674 [EditorBrowsable(EditorBrowsableState.Never)]
675 public static void AttachWindowBelow(string parentAppId, string childAppId)
677 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None;
679 err = Interop.ApplicationManager.AppManagerAttachWindowBelow(parentAppId, childAppId);
680 if (err != Interop.ApplicationManager.ErrorCode.None)
684 case Interop.ApplicationManager.ErrorCode.InvalidParameter:
685 throw new ArgumentException("Invalid argument.");
686 case Interop.ApplicationManager.ErrorCode.PermissionDenied:
687 throw new UnauthorizedAccessException("Permission denied.");
688 case Interop.ApplicationManager.ErrorCode.IoError:
689 throw new InvalidOperationException("IO error at unmanaged code.");
690 case Interop.ApplicationManager.ErrorCode.OutOfMemory:
691 throw new InvalidOperationException("Out-of-memory at unmanaged code.");
692 case Interop.ApplicationManager.ErrorCode.NoSuchApp:
693 throw new InvalidOperationException("No such application.");
699 internal static class FilterExtension
701 private const string LogTag = "Tizen.Applications";
702 internal static void Fetch(this ApplicationInfoFilter filter, Interop.ApplicationManager.AppInfoFilterCallback callback)
704 if (filter is ApplicationInfoMetadataFilter)
706 ApplicationInfoMetadataFilter metaFilter = (ApplicationInfoMetadataFilter)filter;
707 metaFilter.Fetch(callback);
711 IntPtr nativeHandle = MakeNativeAppInfoFilter(filter.Filter);
712 if (nativeHandle == IntPtr.Zero)
714 throw ApplicationManagerErrorFactory.NativeFilterHandleIsInvalid();
718 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppInfoFilterForeachAppinfo(nativeHandle, callback, IntPtr.Zero);
719 if (err != Interop.ApplicationManager.ErrorCode.None)
721 throw ApplicationManagerErrorFactory.GetException(err, "Failed to get application information list with filter.");
726 Interop.ApplicationManager.AppInfoFilterDestroy(nativeHandle);
730 internal static void Fetch(this ApplicationInfoMetadataFilter filter, Interop.ApplicationManager.AppInfoFilterCallback callback)
732 IntPtr nativeHandle = MakeNativeAppMetadataFilter(filter.Filter);
733 if (nativeHandle == IntPtr.Zero)
735 throw ApplicationManagerErrorFactory.NativeFilterHandleIsInvalid();
739 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppInfoMetadataFilterForeach(nativeHandle, callback, IntPtr.Zero);
740 if (err != Interop.ApplicationManager.ErrorCode.None)
742 throw ApplicationManagerErrorFactory.GetException(err, "Failed to get metadata list with filter.");
747 Interop.ApplicationManager.AppInfoMetadataFilterDestroy(nativeHandle);
751 private static IntPtr MakeNativeAppInfoFilter(IDictionary<string, string> filter)
753 if (filter == null || filter.Count == 0)
755 throw ApplicationManagerErrorFactory.FilterIsInvalid();
758 IntPtr infoHandle = IntPtr.Zero;
759 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppInfoFilterCreate(out infoHandle);
760 if (err != Interop.ApplicationManager.ErrorCode.None)
762 throw ApplicationManagerErrorFactory.GetException(err, "Failed to create the filter handle.");
765 foreach (var item in filter)
767 if ((item.Key == ApplicationInfoFilter.Keys.Id) ||
768 (item.Key == ApplicationInfoFilter.Keys.Type) ||
769 (item.Key == ApplicationInfoFilter.Keys.Category) ||
770 (item.Key == ApplicationInfoFilter.Keys.InstalledStorage))
772 err = Interop.ApplicationManager.AppInfoFilterAddString(infoHandle, item.Key, item.Value);
774 else if ((item.Key == ApplicationInfoFilter.Keys.NoDisplay) ||
775 (item.Key == ApplicationInfoFilter.Keys.TaskManage))
777 err = Interop.ApplicationManager.AppInfoFilterAddBool(infoHandle, item.Key, Convert.ToBoolean(item.Value));
781 Log.Warn(LogTag, string.Format("'{0}' is not supported key for the filter.", item.Key));
783 if (err != Interop.ApplicationManager.ErrorCode.None)
785 Interop.ApplicationManager.AppInfoFilterDestroy(infoHandle);
786 throw ApplicationManagerErrorFactory.GetException(err, "Failed to add item to the filter.");
792 private static IntPtr MakeNativeAppMetadataFilter(IDictionary<string, string> filter)
794 if (filter == null || filter.Count == 0)
796 throw ApplicationManagerErrorFactory.FilterIsInvalid();
799 IntPtr infoHandle = IntPtr.Zero;
800 Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.AppInfoMetadataFilterCreate(out infoHandle);
801 if (err != Interop.ApplicationManager.ErrorCode.None)
803 throw ApplicationManagerErrorFactory.GetException(err, "Failed to create the filter for searching with metadata.");
805 foreach (var item in filter)
807 err = Interop.ApplicationManager.AppInfoMetadataFilterAdd(infoHandle, item.Key, item.Value);
808 if (err != Interop.ApplicationManager.ErrorCode.None)
810 Interop.ApplicationManager.AppInfoMetadataFilterDestroy(infoHandle);
811 throw ApplicationManagerErrorFactory.GetException(err, "Failed to add the item to the filter.");
818 internal static class ApplicationManagerErrorFactory
820 internal static Exception NativeFilterHandleIsInvalid()
822 return new InvalidOperationException("The native handle for filtering is invalid.");
825 internal static Exception FilterIsInvalid()
827 return new ArgumentException("The filter is invalid.");
830 internal static Exception GetException(Interop.ApplicationManager.ErrorCode err, string message)
832 string errMessage = String.Format("{0} err = {1}", message, err);
835 case Interop.ApplicationManager.ErrorCode.InvalidParameter:
836 return new ArgumentException(errMessage);
838 return new InvalidOperationException(errMessage);