From 5e7f65faf143f1833b47f77b1ae689151559b402 Mon Sep 17 00:00:00 2001 From: Seungkeun Lee Date: Mon, 7 Mar 2016 10:46:49 +0900 Subject: [PATCH] Add Service - Appcontrol handler without UI - Service was created only one instance by ServiceManager - It can start using StartService - It can stop using StopService - It can stop itself, using Terminate API - When it was created, OnCreate was called - When it was terminate, OnTerminate was called - When it received the AppControl, OnAppControl was called - TODO. if All context was removed, but the running service was existed. process should not terminate, but now there is no API. Change-Id: Ibb2b59206b85735236fe733aed2db5c3f6db5097 --- Tizen.Application/Tizen.Application.csproj | 4 +- Tizen.Application/Tizen.Application/Actor.cs | 9 +++ Tizen.Application/Tizen.Application/AppControl.cs | 5 ++ Tizen.Application/Tizen.Application/Application.cs | 63 ++++++++++++---- Tizen.Application/Tizen.Application/Service.cs | 27 +++++++ .../Tizen.Application/ServiceManager.cs | 87 ++++++++++++++++++++++ 6 files changed, 179 insertions(+), 16 deletions(-) create mode 100755 Tizen.Application/Tizen.Application/Service.cs create mode 100755 Tizen.Application/Tizen.Application/ServiceManager.cs diff --git a/Tizen.Application/Tizen.Application.csproj b/Tizen.Application/Tizen.Application.csproj index 942d0f1..f72eba5 100755 --- a/Tizen.Application/Tizen.Application.csproj +++ b/Tizen.Application/Tizen.Application.csproj @@ -60,6 +60,8 @@ + + @@ -74,4 +76,4 @@ --> - + \ No newline at end of file diff --git a/Tizen.Application/Tizen.Application/Actor.cs b/Tizen.Application/Tizen.Application/Actor.cs index da7a17e..c4d4548 100755 --- a/Tizen.Application/Tizen.Application/Actor.cs +++ b/Tizen.Application/Tizen.Application/Actor.cs @@ -85,6 +85,15 @@ namespace Tizen.Application _context.StartActor(actor, appControl); } + protected void StartService(Type serviceType, AppControl appControl) + { + Application.StartService(serviceType, appControl); + } + protected void StopService(Type serviceType) + { + Application.StopService(serviceType); + } + public void Finish() { throw new NotImplementedException(); diff --git a/Tizen.Application/Tizen.Application/AppControl.cs b/Tizen.Application/Tizen.Application/AppControl.cs index 741b73d..6faea1a 100755 --- a/Tizen.Application/Tizen.Application/AppControl.cs +++ b/Tizen.Application/Tizen.Application/AppControl.cs @@ -53,6 +53,11 @@ namespace Tizen.Application Interop.AppControl.GetUri(handle, out _uri); } + internal bool isService + { + get {return false;} + } + public AppControl(string operation, string mime, string uri) { _operation = operation; diff --git a/Tizen.Application/Tizen.Application/Application.cs b/Tizen.Application/Tizen.Application/Application.cs index af1ec16..55d779a 100755 --- a/Tizen.Application/Tizen.Application/Application.cs +++ b/Tizen.Application/Tizen.Application/Application.cs @@ -12,6 +12,7 @@ namespace Tizen.Application private static Dictionary _filterMap = new Dictionary(); private static List _contextList = new List(); private static Window _window = null; + private static ServiceManager _serviceManager = new ServiceManager(); public static event EventHandler ApplicationInit; public static event EventHandler ApplicationExit; @@ -24,8 +25,6 @@ namespace Tizen.Application ops.OnCreate = (userData) => { ApplicationInit(null, null); - if (_window == null) - _window = new Window(); return true; }; ops.OnPause = (userData) => @@ -45,23 +44,32 @@ namespace Tizen.Application ops.OnAppControl = (appControlHandle, userData) => { AppControl appControl = new AppControl(appControlHandle); - foreach (var item in _filterMap) + if (appControl.isService) { - if (item.Key.IsMatch(appControl)) + _serviceManager.OnAppControl(appControl); + } else { + foreach (var item in _filterMap) { - if (CurrentContext == null || !appControl.IsLaunchOperation()) + if (item.Key.IsMatch(appControl)) { - ApplicationContext ctx = new ApplicationContext(); - ctx.ReleaseContext += Ctx_ReleaseContext; - _contextList.Add(ctx); - Actor actor = ctx.StartActor(item.Value, appControl); - if (!_window.Visible) { - _window.Active(); - _window.Show(); - ctx.Resume(); + // Window was created when the first UI Actor was created + if (_window == null) + _window = new Window(); + if (CurrentContext == null || !appControl.IsLaunchOperation()) + { + ApplicationContext ctx = new ApplicationContext(); + ctx.ReleaseContext += Ctx_ReleaseContext; + _contextList.Add(ctx); + Actor actor = ctx.StartActor(item.Value, appControl); + if (!_window.Visible) + { + _window.Active(); + _window.Show(); + ctx.Resume(); + } } + break; } - break; } } }; @@ -79,7 +87,8 @@ namespace Tizen.Application public static void Hide() { - throw new NotImplementedException(); + if (_window != null) + _window.InActive(); } public static void Exit() @@ -99,6 +108,7 @@ namespace Tizen.Application Hide(); } else { + // TODO. If running service was existed, application should not terminated, but Send the message to AUL(UI App terminate) Exit(); } } @@ -139,6 +149,29 @@ namespace Tizen.Application } } + public static void AddServiceHandler(Type clazz) + { + AddServiceHandler(clazz, new AppControlFilter[0] { }); + } + + public static void AddServiceHandler(Type clazz, AppControlFilter filter) + { + AddServiceHandler(clazz, new AppControlFilter[] { filter }); + } + + public static void AddServiceHandler(Type clazz, AppControlFilter[] filters) + { + _serviceManager.AddServiceHandler(clazz, filters); + } + + internal static void StartService(Type clazz, AppControl appControl) + { + _serviceManager.StartService(clazz, appControl); + } + internal static void StopService(Type clazz) + { + _serviceManager.StopService(clazz); + } } diff --git a/Tizen.Application/Tizen.Application/Service.cs b/Tizen.Application/Tizen.Application/Service.cs new file mode 100755 index 0000000..3ae207d --- /dev/null +++ b/Tizen.Application/Tizen.Application/Service.cs @@ -0,0 +1,27 @@ +namespace Tizen.Application { + public class Service { + public Service() { } + + public void Terminate() + { + Application.StopService(GetType()); + } + + protected virtual void OnCreate() { } + protected virtual void OnTerminate() { } + protected virtual void OnAppControl(AppControl appControl) { } + + internal void DidCreate() + { + OnCreate(); + } + internal void DidTerminate() + { + OnTerminate(); + } + internal void DidAppControl(AppControl appControl) + { + OnAppControl(appControl); + } + } +} diff --git a/Tizen.Application/Tizen.Application/ServiceManager.cs b/Tizen.Application/Tizen.Application/ServiceManager.cs new file mode 100755 index 0000000..7e14327 --- /dev/null +++ b/Tizen.Application/Tizen.Application/ServiceManager.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; + +namespace Tizen.Application +{ + public class ServiceManager + { + private Dictionary _filterMap = new Dictionary(); + private Dictionary _runningService = new Dictionary(); + + public ServiceManager() { } + internal void AddServiceHandler(Type clazz, AppControlFilter[] filters) + { + if (!clazz.IsSubclassOf(typeof(Service))) + throw new ArgumentException(clazz.FullName + " is not a subclass of Service."); + + foreach (var prop in clazz.GetProperties()) + { + foreach (var attr in prop.GetCustomAttributes(false)) + { + var filter = attr as AppControlFilter; + if (filter != null) + { + _filterMap.Add(filter, clazz); + } + } + } + if (filters != null) + { + foreach (var filter in filters) + { + _filterMap.Add(filter, clazz); + } + } + } + internal void OnAppControl(AppControl appControl) + { + foreach (var item in _filterMap) + { + if (item.Key.IsMatch(appControl)) + { + StartService(item.Value, appControl); + break; + } + } + } + + internal void StartService(Type clazz, AppControl appControl) + { + lock (_runningService) + { + if (_runningService.ContainsKey(clazz)) + { + _runningService[clazz].DidAppControl(appControl); + } else + { + _runningService[clazz] = (Service)Activator.CreateInstance(clazz); + _runningService[clazz].DidCreate(); + _runningService[clazz].DidAppControl(appControl); + } + } + } + + internal void StopService(Type clazz) + { + lock (_runningService) + { + if (_runningService.ContainsKey(clazz)) + { + _runningService[clazz].DidTerminate(); + _runningService.Remove(clazz); + } + } + } + + internal bool ServiceAlived + { + get + { + lock (_runningService) + { + return _runningService.Count > 0; + } + } + } + } +} -- 2.7.4