add new features
[framework/osp/appwidget-service.git] / src / FShell_AppWidgetManagerService.cpp
index 3dd150d..327f2ba 100644 (file)
@@ -48,6 +48,7 @@ static const RequestId        LOCAL_EVENT_REQUEST_UPDATE = 0;
 }
 
 extern const int UPDATE_PERIOD_MSEC_MIN;
+const wchar_t INVALID_INSTANCE[] = L"file://invalid instance id";
 
 AppWidgetManagerService* AppWidgetManagerService::__pTheInstance = null;
 
@@ -394,7 +395,7 @@ AppWidgetManagerService::OnAppWidgetPause(struct event_arg *arg, void* data)
 int
 AppWidgetManagerService::OnAppWidgetPauseAll(struct event_arg *arg, void* data)
 {
-       SysLog(NID_SHELL, "OnAppWidgetPauseAll");
+       SysLog(NID_SHELL, "I");
 
        AppWidgetManagerService* pAppManagerService = AppWidgetManagerService::GetInstance();
 
@@ -406,6 +407,7 @@ AppWidgetManagerService::OnAppWidgetPauseAll(struct event_arg *arg, void* data)
                pAppWidgetContext->OnBackground();
        }
 
+       SysLog(NID_SHELL, "O");
     return 0;
 }
 
@@ -425,7 +427,7 @@ AppWidgetManagerService::OnAppWidgetResume(struct event_arg *pArg, void* pData)
 int
 AppWidgetManagerService::OnAppWidgetResumeAll(struct event_arg *pArg, void* pData)
 {
-       SysLog(NID_SHELL, "OnAppWidgetResumeAll");
+       SysLog(NID_SHELL, "I");
 
        AppWidgetManagerService* pAppManagerService = AppWidgetManagerService::GetInstance();
 
@@ -437,6 +439,7 @@ AppWidgetManagerService::OnAppWidgetResumeAll(struct event_arg *pArg, void* pDat
                pAppWidgetContext->OnForeground();
        }
 
+       SysLog(NID_SHELL, "O");
     return 0;
 }
 
@@ -587,6 +590,31 @@ AppWidgetManagerService::RequestUpdate(const Tizen::App::AppId& appId, const Tiz
        return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
 }
 
+// for resuming
+result
+AppWidgetManagerService::RequestUpdate(_AppWidgetContext* pAppWidgetContext, const String& argument)
+{
+       if (pAppWidgetContext)
+       {
+               ArrayList* pArray = new (std::nothrow) ArrayList();
+               SysTryReturnResult(NID_SHELL, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
+
+               pArray->Construct();
+               pArray->Add(pAppWidgetContext);
+               pArray->Add(new String(argument));
+
+               result r = __handlerThread.SendUserEvent(LOCAL_EVENT_REQUEST_UPDATE, pArray);
+               SysTryLog(NID_SHELL, !IsFailed(r), "[%s] Propagated.", GetErrorMessage(r));
+       }
+       else
+       {
+               SysLog(NID_SHELL, "pAppWidgetContext is null.");
+       }
+
+       SysLog(NID_SHELL, "O");
+       return E_SUCCESS;
+}
+
 result
 AppWidgetManagerService::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
 {
@@ -685,10 +713,29 @@ AppWidgetManagerService::RequestReleaseSharedMemoryForPD(const Tizen::App::AppId
 result
 AppWidgetManagerService::SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded)
 {
+       _AppWidgetContext* pAppWidgetContext = null;
+
        if (!isSucceeded)
        {
-               _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
-               SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
+               SysLog(NID_SHELL, "SendResult is called[false].");
+
+               if (instanceId == INVALID_INSTANCE)
+               {
+                       for (int i = 0; i < __appWidgetContextList.GetCount(); i++)
+                       {
+                               __appWidgetContextList.GetAt(i, pAppWidgetContext);
+
+                               if (!pAppWidgetContext->IsRunning())
+                               {
+                                       break;
+                               }
+                       }
+               }
+               else    
+               {
+                       pAppWidgetContext = this->Find(appId, instanceId);
+                       SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
+               }
 
                std::unique_ptr<char[]> packageName(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
                std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
@@ -697,15 +744,46 @@ AppWidgetManagerService::SendResult(const Tizen::App::AppId& appId, const Tizen:
                SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
 
                result r = pAppWidgetContext->OnRemoved();
-               SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute OnRemoved.");
+               SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute OnRemoved.");
 
                r = RemoveAppWidget(packageName.get(), id.get(), true);
-               SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute RemoveAppWidget.");
+               SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
+
+               RequestPendingEvent();
+       }
+       else    // for pending event excluding touch event.
+       {
+               SysLog(NID_SHELL, "SendResult is called[true].");
+
+               pAppWidgetContext = this->Find(appId, instanceId);
+
+               if (pAppWidgetContext)
+               {
+                       SysLog(NID_SHELL, "AppWidgetContext for %ls exists.", instanceId.GetPointer());
+                       RequestPendingEvent();
+               }
+               else
+               {
+                       SysLog(NID_SHELL, "AppWidgetContext for %ls is empty.", instanceId.GetPointer());
+               }
        }
 
        return E_SUCCESS;
 }
 
+result
+AppWidgetManagerService::RequestPendingEvent(void)
+{
+       for (int i = 0; i < __appWidgetContextList.GetCount(); i++ )
+       {
+               _AppWidgetContext* pAppWidgetContext = null;
+               __appWidgetContextList.GetAt(i, pAppWidgetContext);
+
+               pAppWidgetContext->SendPendingEvent();
+       }
+
+       return E_SUCCESS;
+}
 
 AppWidgetManagerService::_TaskHandlerThread::~_TaskHandlerThread(void)
 {