1 /// Copyright 2016 by Samsung Electronics, Inc.,
3 /// This software is the confidential and proprietary information
4 /// of Samsung Electronics, Inc. ("Confidential Information"). You
5 /// shall not disclose such Confidential Information and shall use
6 /// it only in accordance with the terms of the license agreement
7 /// you entered into with Samsung.
11 using System.Collections.Generic;
12 using System.Threading.Tasks;
13 using System.Runtime.InteropServices;
15 namespace Tizen.Applications.Managers
17 internal class ApplicationManagerImpl : IDisposable
19 private static ApplicationManagerImpl s_instance = new ApplicationManagerImpl();
21 private bool _disposed = false;
22 private Interop.ApplicationManager.AppManagerAppContextEventCallback _applicationChangedEventCallback;
24 private const string LogTag = "Tizen.Applications.Managers";
26 private ApplicationManagerImpl()
28 Log.Debug(LogTag, "ApplicationManagerImpl()");
29 RegisterApplicationChangedEvent();
33 ~ApplicationManagerImpl()
38 internal event EventHandler<ApplicationChangedEventArgs> ApplicationLaunched;
39 internal event EventHandler<ApplicationChangedEventArgs> ApplicationTerminated;
41 internal static ApplicationManagerImpl Instance
52 GC.SuppressFinalize(this);
55 private void Dispose(bool disposing)
62 // Free managed objects.
64 //Free unmanaged objects
65 UnRegisterApplicationChangedEvent();
69 internal async Task<IEnumerable<InstalledApplication>> GetInstalledAppsAsync()
71 Log.Debug(LogTag, "GetInstalledAppsAsync()");
72 return await Task.Run(() =>
74 List<InstalledApplication> Result = new List<InstalledApplication>();
76 Interop.ApplicationManager.AppManagerAppInfoCallback cb = (IntPtr handle, IntPtr userData) =>
78 if (handle != IntPtr.Zero)
80 IntPtr clonedHandle = IntPtr.Zero;
81 int result = Interop.ApplicationManager.AppInfoClone(out clonedHandle, handle);
86 InstalledApplication app = new InstalledApplication(clonedHandle);
92 int ret = Interop.ApplicationManager.AppManagerForeachAppInfo(cb, IntPtr.Zero);
95 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetInstalledAppsAsync() failed.");
101 internal async Task<IEnumerable<InstalledApplication>> GetInstalledAppsAsync(InstalledApplicationFilter filter)
103 Log.Debug(LogTag, "GetInstalledAppsAsync(InstalledApplicationFilter filter)");
104 return await Task.Run(() =>
106 List<InstalledApplication> Result = new List<InstalledApplication>();
108 Interop.ApplicationManager.AppInfoFilterCallback cb = (IntPtr handle, IntPtr userData) =>
110 Log.Debug(LogTag, "AppInfoFilterCallback");
111 if (handle != IntPtr.Zero)
113 IntPtr clonedHandle = IntPtr.Zero;
114 int ret = Interop.ApplicationManager.AppInfoClone(out clonedHandle, handle);
119 InstalledApplication app = new InstalledApplication(clonedHandle);
129 internal async Task<IEnumerable<RunningApplication>> GetRunningAppsAsync()
131 Log.Debug(LogTag, "GetRunningAppsAsync()");
133 return await Task.Run(() =>
135 List<RunningApplication> Result = new List<RunningApplication>();
137 Interop.ApplicationManager.AppManagerAppContextCallback cb = (IntPtr handle, IntPtr userData) =>
139 Log.Debug(LogTag, "AppManagerAppContextCallback");
140 if (handle != IntPtr.Zero)
142 IntPtr ptr = IntPtr.Zero;
143 int result = Interop.ApplicationManager.AppContextGetAppId(handle, out ptr);
148 string appid = Marshal.PtrToStringAuto(ptr);
150 result = Interop.ApplicationManager.AppContextGetPid(handle, out pid);
155 RunningApplication app = new RunningApplication(appid, pid);
162 int ret = Interop.ApplicationManager.AppManagerForeachAppContext(cb, IntPtr.Zero);
165 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetRunningAppsAsync() failed.");
171 internal InstalledApplication GetInstalledApp(string applicationId)
173 Log.Debug(LogTag, "GetInstalledApp(applicationId)");
174 IntPtr handle = IntPtr.Zero;
175 int ret = Interop.ApplicationManager.AppManagerGetAppInfo(applicationId, out handle);
178 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetInstalledApp(applicationId) failed.");
180 if (handle != IntPtr.Zero)
182 InstalledApplication app = new InstalledApplication(handle);
188 internal RunningApplication GetRunningApp(string applicationId)
190 Log.Debug(LogTag, "GetRunningApp(applicationId)");
191 IntPtr handle = IntPtr.Zero;
192 int ret = Interop.ApplicationManager.AppManagerGetAppContext(applicationId, out handle);
195 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetRunningApp(applicationId) failed.");
197 if (handle != IntPtr.Zero)
200 ret = Interop.ApplicationManager.AppContextGetPid(handle, out pid);
203 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetRunningApp(applicationId) failed.");
205 RunningApplication app = new RunningApplication(applicationId, pid);
211 internal RunningApplication GetRunningApp(int processId)
213 Log.Debug(LogTag, "GetRunningApp(processId)");
215 int ret = Interop.ApplicationManager.AppManagerGetAppId(processId, out appid);
218 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetRunningApp(processId) failed.");
220 RunningApplication app = new RunningApplication(appid, processId);
224 internal bool IsRunningApp(string applicationId)
226 Log.Debug(LogTag, "IsRunningApp(applicationId)");
227 bool running = false;
228 int ret = Interop.ApplicationManager.AppManagerIsRunning(applicationId, out running);
231 Log.Warn(LogTag, "IsRunningApp(applicationId) failed.");
236 internal bool IsRunningApp(int processId)
238 Log.Debug(LogTag, "IsRunningApp(processId)");
240 int ret = Interop.ApplicationManager.AppManagerGetAppId(processId, out appid);
243 ApplicationManagerErrorFactory.ExceptionChecker(ret, "IsRunningApp(processId) failed.");
245 bool running = false;
246 ret = Interop.ApplicationManager.AppManagerIsRunning(appid, out running);
249 Log.Warn(LogTag, "IsRunningApp(processId) failed.");
254 private void RegisterApplicationChangedEvent()
256 Log.Debug(LogTag, "RegisterApplicationChangedEvent()");
257 _applicationChangedEventCallback = (IntPtr handle, int state, IntPtr userData) =>
259 Log.Debug(LogTag, "ApplicationChangedEventCallback");
260 if (handle == IntPtr.Zero) return;
262 IntPtr ptr = IntPtr.Zero;
263 int result = Interop.ApplicationManager.AppContextGetAppId(handle, out ptr);
266 ApplicationManagerErrorFactory.ExceptionChecker(result, "RegisterApplicationChangedEvent() failed.");
268 string appid = Marshal.PtrToStringAuto(ptr);
270 result = Interop.ApplicationManager.AppContextGetPid(handle, out pid);
273 ApplicationManagerErrorFactory.ExceptionChecker(result, "RegisterApplicationChangedEvent() failed.");
277 var launchedEventCache = ApplicationLaunched;
278 if (launchedEventCache != null)
280 Log.Debug(LogTag, "Raise up ApplicationLaunched");
281 ApplicationChangedEventArgs e = new ApplicationChangedEventArgs(appid, pid, state);
282 launchedEventCache(null, e);
287 var terminatedEventCache = ApplicationTerminated;
288 if (terminatedEventCache != null)
290 Log.Debug(LogTag, "Raise up ApplicationTerminated");
291 ApplicationChangedEventArgs e = new ApplicationChangedEventArgs(appid, pid, state);
292 terminatedEventCache(null, e);
296 int ret = Interop.ApplicationManager.AppManagerSetAppContextEvent(_applicationChangedEventCallback, IntPtr.Zero);
299 ApplicationManagerErrorFactory.ExceptionChecker(ret, "RegisterApplicationChangedEvent() register failed.");
303 private void UnRegisterApplicationChangedEvent()
305 Log.Debug(LogTag, "UnRegisterApplicationChangedEvent()");
306 Interop.ApplicationManager.AppManagerUnSetAppContextEvent();
309 internal static class FilterExtension
311 private const string LogTag = "Tizen.Applications.Managers";
312 internal static void Fetch(this InstalledApplicationFilter filter, Interop.ApplicationManager.AppInfoFilterCallback callback)
314 if (filter is InstalledApplicationMetadataFilter)
316 InstalledApplicationMetadataFilter metaFilter = (InstalledApplicationMetadataFilter)filter;
317 metaFilter.Fetch(callback);
321 IntPtr nativeHandle = MakeNativeAppInfoFilter(filter.Filter);
322 int ret = Interop.ApplicationManager.AppInfoFilterForeachAppinfo(nativeHandle, callback, IntPtr.Zero);
323 if (nativeHandle != IntPtr.Zero)
324 Interop.ApplicationManager.AppInfoFilterDestroy(nativeHandle);
327 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetInstalledAppsAsync(InstalledApplicationFilter) failed.");
331 internal static void Fetch(this InstalledApplicationMetadataFilter filter, Interop.ApplicationManager.AppInfoFilterCallback callback)
333 IntPtr nativeHandle = MakeNativeAppMetadataFilter(filter.Filter);
334 int ret = Interop.ApplicationManager.AppInfoMetadataFilterForeach(nativeHandle, callback, IntPtr.Zero);
335 if (nativeHandle != IntPtr.Zero)
336 Interop.ApplicationManager.AppInfoMetadataFilterDestroy(nativeHandle);
339 ApplicationManagerErrorFactory.ExceptionChecker(ret, "GetInstalledAppsAsync(InstalledApplicationMetadataFilter) failed.");
344 private static IntPtr MakeNativeAppInfoFilter(IDictionary<string, string> filter)
347 throw new ArgumentException("Filter dose not added");
349 int ret = Interop.ApplicationManager.AppInfoFilterCreate(out handle);
352 ApplicationManagerErrorFactory.ExceptionChecker(ret, "AppInfoFilter creation failed.");
355 foreach (var item in filter)
357 if ((item.Key == InstalledApplicationFilter.Keys.Id) ||
358 (item.Key == InstalledApplicationFilter.Keys.Type) ||
359 (item.Key == InstalledApplicationFilter.Keys.Category))
361 ret = Interop.ApplicationManager.AppInfoFilterAddString(handle, item.Key, item.Value);
363 else if ((item.Key == InstalledApplicationFilter.Keys.NoDisplay) ||
364 (item.Key == InstalledApplicationFilter.Keys.TaskManage))
366 ret = Interop.ApplicationManager.AppInfoFilterAddBool(handle, item.Key, Convert.ToBoolean(item.Value));
370 Log.Warn(LogTag, "InstalledApplicationFilter is NOT supported " + item.Key + " key.");
374 Interop.ApplicationManager.AppInfoFilterDestroy(handle);
375 ApplicationManagerErrorFactory.ExceptionChecker(ret, "InstalledApplicationFilter item add failed.");
381 private static IntPtr MakeNativeAppMetadataFilter(IDictionary<string, string> filter)
384 throw new ArgumentException("Filter dose not added");
386 int ret = Interop.ApplicationManager.AppInfoMetadataFilterCreate(out handle);
389 ApplicationManagerErrorFactory.ExceptionChecker(ret, "InstalledApplicationMetadataFilter creation failed.");
391 foreach (var item in filter)
393 ret = Interop.ApplicationManager.AppInfoMetadataFilterAdd(handle, item.Key, item.Value);
396 Interop.ApplicationManager.AppInfoMetadataFilterDestroy(handle);
397 ApplicationManagerErrorFactory.ExceptionChecker(ret, "InstalledApplicationMetadataFilter item add failed.");