From: Hwankyu Jhun Date: Thu, 9 Mar 2017 09:15:10 +0000 (+0900) Subject: Add new APIs X-Git-Tag: submit/trunk/20170823.075128~121^2~89 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=25b5ab028d088f8ac2b4ce384590170134e248eb;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git Add new APIs - Add new property to get IsSubApp - Add new method to get all running app info Change-Id: Ic5caaa6a18219b84ec5bb593152e51c0798e9ce7 Signed-off-by: Hwankyu Jhun --- diff --git a/src/Tizen.Applications.Common/Interop/Interop.ApplicationManager.cs b/src/Tizen.Applications.Common/Interop/Interop.ApplicationManager.cs index a2637fd..de4f638 100644 --- a/src/Tizen.Applications.Common/Interop/Interop.ApplicationManager.cs +++ b/src/Tizen.Applications.Common/Interop/Interop.ApplicationManager.cs @@ -69,6 +69,10 @@ internal static partial class Interop internal static extern void AppManagerUnSetAppContextEvent(); //void app_manager_unset_app_context_event_cb (void); + [DllImport(Libraries.AppManager, EntryPoint = "app_manager_foreach_running_app_context")] + internal static extern ErrorCode AppManagerForeachRunningAppContext(AppManagerAppContextCallback callback, IntPtr userData); + //int app_manager_foreach_running_app_context(app_manager_app_context_cb callback, void *user_data) + [DllImport(Libraries.AppManager, EntryPoint = "app_manager_foreach_app_context")] internal static extern ErrorCode AppManagerForeachAppContext(AppManagerAppContextCallback callback, IntPtr userData); //int app_manager_foreach_app_context(app_manager_app_context_cb callback, void *user_data) @@ -141,6 +145,10 @@ internal static partial class Interop internal static extern ErrorCode AppContextIsEqual(IntPtr first, IntPtr second, out bool equal); //int app_context_is_equal (app_context_h lhs, app_context_h rhs, bool *equal); + [DllImport(Libraries.AppManager, EntryPoint = "app_context_is_sub_app")] + internal static extern ErrorCode AppContextIsSubApp(IntPtr handle, out bool is_sub_app); + //int app_context_is_sub_app(app_context_h app_context, bool *is_sub_app); + [DllImport(Libraries.AppManager, EntryPoint = "app_context_clone")] internal static extern ErrorCode AppContextClone(out IntPtr destination, IntPtr source); //int app_context_clone (app_context_h *clone, app_context_h app_context); diff --git a/src/Tizen.Applications.Common/Tizen.Applications/ApplicationInfo.cs b/src/Tizen.Applications.Common/Tizen.Applications/ApplicationInfo.cs index 1c4858c..f9230fc 100644 --- a/src/Tizen.Applications.Common/Tizen.Applications/ApplicationInfo.cs +++ b/src/Tizen.Applications.Common/Tizen.Applications/ApplicationInfo.cs @@ -27,6 +27,7 @@ namespace Tizen.Applications private const string LogTag = "Tizen.Applications"; private bool _disposed = false; private IntPtr _infoHandle = IntPtr.Zero; + private IntPtr _contextHandle = IntPtr.Zero; private string _applicationId = string.Empty; private Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None; @@ -35,6 +36,12 @@ namespace Tizen.Applications _infoHandle = infoHandle; } + internal ApplicationInfo(IntPtr infoHandle, IntPtr contextHandle) + { + _infoHandle = infoHandle; + _contextHandle = contextHandle; + } + /// /// A constructor of ApplicationInfo that takes the application id. /// @@ -314,26 +321,11 @@ namespace Tizen.Applications get { int pid = 0; - IntPtr contextHandle = IntPtr.Zero; - try - { - err = Interop.ApplicationManager.AppManagerGetAppContext(ApplicationId, out contextHandle); - if (err != Interop.ApplicationManager.ErrorCode.None) - { - Log.Warn(LogTag, "Failed to get the context handle. err = " + err); - } - err = Interop.ApplicationManager.AppContextGetPid(contextHandle, out pid); - if (err != Interop.ApplicationManager.ErrorCode.None) - { - Log.Warn(LogTag, "Failed to get the process id. err = " + err); - } - } - finally + IntPtr contextHandle = GetContextHandle(); + err = Interop.ApplicationManager.AppContextGetPid(contextHandle, out pid); + if (err != Interop.ApplicationManager.ErrorCode.None) { - if (contextHandle != IntPtr.Zero) - { - Interop.ApplicationManager.AppContextDestroy(contextHandle); - } + Log.Warn(LogTag, "Failed to get the process id. err = " + err); } return pid; } @@ -448,29 +440,47 @@ namespace Tizen.Applications get { int value = 0; - IntPtr contextHandle = IntPtr.Zero; - try + IntPtr contextHandle = GetContextHandle(); + err = Interop.ApplicationManager.AppContextGetAppState(contextHandle, out value); + if (err != Interop.ApplicationManager.ErrorCode.None) { - err = Interop.ApplicationManager.AppManagerGetAppContext(ApplicationId, out contextHandle); - if (err != Interop.ApplicationManager.ErrorCode.None) - { - Log.Warn(LogTag, "Failed to get the context handle. err = " + err); - } - err = Interop.ApplicationManager.AppContextGetAppState(contextHandle, out value); - if (err != Interop.ApplicationManager.ErrorCode.None) - { - Log.Warn(LogTag, "Failed to get the app state. err = " + err); - } + Log.Warn(LogTag, "Failed to get the app state. err = " + err); } - finally + return (AppState)value; + } + } + + /// + /// Checks whether the application is running as a sub application of the application group. + /// + public bool IsSubApp + { + get + { + bool value = false; + IntPtr contextHandle = GetContextHandle(); + err = Interop.ApplicationManager.AppContextIsSubApp(contextHandle, out value); + if (err != Interop.ApplicationManager.ErrorCode.None) { - if (contextHandle != IntPtr.Zero) - { - Interop.ApplicationManager.AppContextDestroy(contextHandle); - } + Log.Warn(LogTag, "Failed to get IsSubApp. err = " + err); } - return (AppState)value; + return value; + } + } + + private IntPtr GetContextHandle() + { + if (_contextHandle == IntPtr.Zero) + { + IntPtr contextHandle = IntPtr.Zero; + err = Interop.ApplicationManager.AppManagerGetAppContext(_applicationId, out contextHandle); + if (err != Interop.ApplicationManager.ErrorCode.None) + { + Log.Warn(LogTag, "Failed to get the handle of the ApplicationContext. err = " + err); + } + _contextHandle = contextHandle; } + return _contextHandle; } private IntPtr GetInfoHandle() @@ -509,6 +519,11 @@ namespace Tizen.Applications Interop.ApplicationManager.AppInfoDestroy(_infoHandle); _infoHandle = IntPtr.Zero; } + if (_contextHandle != IntPtr.Zero) + { + Interop.ApplicationManager.AppContextDestroy(_contextHandle); + _contextHandle = IntPtr.Zero; + } _disposed = true; } } diff --git a/src/Tizen.Applications.Common/Tizen.Applications/ApplicationManager.cs b/src/Tizen.Applications.Common/Tizen.Applications/ApplicationManager.cs old mode 100755 new mode 100644 index 83d9c4b..e049a35 --- a/src/Tizen.Applications.Common/Tizen.Applications/ApplicationManager.cs +++ b/src/Tizen.Applications.Common/Tizen.Applications/ApplicationManager.cs @@ -199,7 +199,22 @@ namespace Tizen.Applications Log.Warn(LogTag, "Failed to get appid. err = " + err); return false; } - ApplicationInfo app = GetInstalledApplication(appid); + IntPtr infoHandle = IntPtr.Zero; + err = Interop.ApplicationManager.AppManagerGetAppInfo(appid, out infoHandle); + if (err != Interop.ApplicationManager.ErrorCode.None) + { + Log.Warn(LogTag, "Failed to get the application information."); + return false; + } + IntPtr cloneContextHandle = IntPtr.Zero; + err = Interop.ApplicationManager.AppContextClone(out cloneContextHandle, contextHandle); + if (err != Interop.ApplicationManager.ErrorCode.None) + { + Log.Warn(LogTag, "Failed to clone the application context handle"); + Interop.ApplicationManager.AppInfoDestroy(infoHandle); + return false; + } + ApplicationInfo app = new ApplicationInfo(infoHandle, cloneContextHandle); if (app != null) { result.Add(app); @@ -219,6 +234,61 @@ namespace Tizen.Applications } /// + /// Gets the information of all running applications asynchronously. + /// + public static async Task> GetAllRunningApplicationsAsync() + { + return await Task.Run(() => + { + Interop.ApplicationManager.ErrorCode err = Interop.ApplicationManager.ErrorCode.None; + List result = new List(); + + Interop.ApplicationManager.AppManagerAppContextCallback cb = (IntPtr contextHandle, IntPtr userData) => + { + if (contextHandle != IntPtr.Zero) + { + string appid = string.Empty; + err = Interop.ApplicationManager.AppContextGetAppId(contextHandle, out appid); + if (err != Interop.ApplicationManager.ErrorCode.None) + { + Log.Warn(LogTag, "Failed to get appid. err = " + err); + return false; + } + IntPtr infoHandle = IntPtr.Zero; + err = Interop.ApplicationManager.AppManagerGetAppInfo(appid, out infoHandle); + if (err != Interop.ApplicationManager.ErrorCode.None) + { + Log.Warn(LogTag, "Failed to get the application information."); + return false; + } + IntPtr cloneContextHandle = IntPtr.Zero; + err = Interop.ApplicationManager.AppContextClone(out cloneContextHandle, contextHandle); + if (err != Interop.ApplicationManager.ErrorCode.None) + { + Log.Warn(LogTag, "Failed to clone the application context handle"); + Interop.ApplicationManager.AppInfoDestroy(infoHandle); + return false; + } + ApplicationInfo app = new ApplicationInfo(infoHandle, cloneContextHandle); + if (app != null) + { + result.Add(app); + return true; + } + } + return false; + }; + + err = Interop.ApplicationManager.AppManagerForeachRunningAppContext(cb, IntPtr.Zero); + if (err != Interop.ApplicationManager.ErrorCode.None) + { + throw ApplicationManagerErrorFactory.GetException(err, "Failed to foreach appcontext."); + } + return result; + }); + } + + /// /// Gets the information of the specified application with the application id. /// /// Application id.