Add Service
authorSeungkeun Lee <sngn.lee@samsung.com>
Mon, 7 Mar 2016 01:46:49 +0000 (10:46 +0900)
committerSeungkeun Lee <sngn.lee@samsung.com>
Mon, 7 Mar 2016 05:50:48 +0000 (14:50 +0900)
 - 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
Tizen.Application/Tizen.Application/Actor.cs
Tizen.Application/Tizen.Application/AppControl.cs
Tizen.Application/Tizen.Application/Application.cs
Tizen.Application/Tizen.Application/Service.cs [new file with mode: 0755]
Tizen.Application/Tizen.Application/ServiceManager.cs [new file with mode: 0755]

index 942d0f1..f72eba5 100755 (executable)
@@ -60,6 +60,8 @@
     <Compile Include="Tizen.Application\ApplicationContext.cs" />
     <Compile Include="Tizen.Application\CodeExample.cs" />
     <Compile Include="Tizen.Application\Page.cs" />
+    <Compile Include="Tizen.Application\Service.cs" />
+    <Compile Include="Tizen.Application\ServiceManager.cs" />
     <Compile Include="Tizen.Application\Window.cs" />
     <Compile Include="Tizen.Application\TizenSynchronizationContext.cs" />
   </ItemGroup>
@@ -74,4 +76,4 @@
   <Target Name="AfterBuild">
   </Target>
   -->
-</Project>
+</Project>
\ No newline at end of file
index da7a17e..c4d4548 100755 (executable)
@@ -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();
index 741b73d..6faea1a 100755 (executable)
@@ -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;
index af1ec16..55d779a 100755 (executable)
@@ -12,6 +12,7 @@ namespace Tizen.Application
         private static Dictionary<AppControlFilter, Type> _filterMap = new Dictionary<AppControlFilter, Type>();
         private static List<ApplicationContext> _contextList = new List<ApplicationContext>();
         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 (executable)
index 0000000..3ae207d
--- /dev/null
@@ -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 (executable)
index 0000000..7e14327
--- /dev/null
@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+
+namespace Tizen.Application
+{
+    public class ServiceManager
+    {
+        private Dictionary<AppControlFilter, Type> _filterMap = new Dictionary<AppControlFilter, Type>();
+        private Dictionary<Type, Service> _runningService = new Dictionary<Type, Service>();
+
+        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;
+                }
+            }
+        }
+    }
+}