Update background-support app's memory policy and reorganize some code
authorLongXiang <xiang.long@intel.com>
Tue, 29 Jan 2013 08:09:34 +0000 (16:09 +0800)
committerTaejeong Lee <taejeong.lee@samsung.com>
Fri, 1 Feb 2013 06:08:00 +0000 (15:08 +0900)
[Issue#] N/A
[Problem] There's a limitation on hidden applications number(current 15) which is kept by
apps' /proc/[pid]/oom_adj values. Least recently used app will have the highest oom_adj
value, when hidden apps number limitation is reached, the app will be killed. However
background-support enabled app shouldn't be one of this kind, it shouldn't be count as
a hidden app when goes to background.
[Cause] N/A
[Solution] Make background-support enabled app active when goes to background by using
sysman's API. oom_adj value will be updated accordingly by these APIs. Move
backgroun-support check logic from RunnableWidgetObject to ViewLogic.

Change-Id: I29ef92153e345c31bd50d4c034f44fa6fced5e33

packaging/wrt.spec
src/api_new/runnable_widget_object.cpp
src/view/i_view_module.h
src/view/webkit/CMakeLists.txt
src/view/webkit/view_logic.cpp
src/view/webkit/view_logic.h

index e2fc0f9..34c0d51 100644 (file)
@@ -43,6 +43,7 @@ BuildRequires:  pkgconfig(wrt-plugin-js-overlay)
 BuildRequires:  pkgconfig(dpl-encryption)
 BuildRequires:  pkgconfig(wrt-popup-wrt-runner)
 BuildRequires:  pkgconfig(wrt-popup-ace-runner)
+BuildRequires:  pkgconfig(sysman)
 
 ## wrt-launchpad-daemon #######################################################
 BuildRequires:  pkgconfig(app-checker)
index 029a0fe..61d96a2 100644 (file)
@@ -34,9 +34,6 @@
 #include <popup-runner/PopupInvoker.h>
 
 namespace { //Anonymous
-
-const wchar_t* BACKGROUND_ENABLED = L"background_enabled" ;
-
 const std::string ACCESS_DENIED = _("IDS_BR_POP_ACCESS_DENIED");
 const std::string ALREADY_RUNNING = _("IDS_BR_POP_ALREADY_RUNNING");
 const std::string INVALID_LOCALE = _("IDS_IM_POP_INVALID_WIDGET_LOCALE");
@@ -135,7 +132,8 @@ void RunnableWidgetObject::Show()
     change.commit();
 }
 
-void RunnableWidgetObject::Hide() {
+void RunnableWidgetObject::Hide()
+{
     State::StateChange change = m_guardstate->allowHide();
 
     m_view->hideWidget();
@@ -144,38 +142,11 @@ void RunnableWidgetObject::Hide() {
     change.commit();
 }
 
-void RunnableWidgetObject::Suspend() {
+void RunnableWidgetObject::Suspend()
+{
     LogDebug("Suspending widget");
     State::StateChange change = m_guardstate->allowSuspend();
-    Assert(m_widgetModel);
-
-    bool suspendWebkit = true;
-
-    if( m_widgetModel->SettingList.Get().getBackgroundSupport()
-        == BackgroundSupport_Enable ) {
-        //skip suspendWidget
-        LogDebug("Background enabled, skipping suspend");
-        suspendWebkit = false;
-    }
-#ifndef DEPRECATED_SETTING_STRING
-    else {
-        WrtDB::WidgetDAOReadOnly dao(m_widgetModel->TizenId);
-        WrtDB::PropertyDAOReadOnly::WidgetPropertyValue bgEnableValue =
-            dao.getPropertyValue(DPL::String(BACKGROUND_ENABLED));
-
-        if(!bgEnableValue.IsNull() && !bgEnableValue->compare(L"true")) {
-            //skip suspendWidget
-            LogDebug("Background enabled, skipping suspend");
-            suspendWebkit = false;
-        }
-    }
-#endif
-
-    m_view->changeViewVisibility(false);
-    if(suspendWebkit) //if widget has background page suspending wk will be skipped
-    {
-        m_view->suspendWidget();
-    }
+    m_view->suspendWidget();
 
     change.commit();
 }
@@ -203,7 +174,8 @@ void RunnableWidgetObject::ReloadStartPage()
     m_view->reloadStartPage();
 }
 
-Evas_Object* RunnableWidgetObject::GetCurrentWebview() {
+Evas_Object* RunnableWidgetObject::GetCurrentWebview()
+{
     State::StateChange change = m_guardstate->allowGetCurrentWebview();
 
     Evas_Object* cww = m_view->getCurrentWebview();
@@ -218,7 +190,8 @@ void RunnableWidgetObject::SetUserDelegates(const UserDelegatesPtr& cbs) {
     change.commit();
 }
 
-void RunnableWidgetObject::Backward() {
+void RunnableWidgetObject::Backward()
+{
     State::StateChange change = m_guardstate->allowBackward();
     m_view->backward();
 
index e24da45..8622b01 100755 (executable)
@@ -46,7 +46,6 @@ public:
     virtual void prepareView(WidgetModel *, const std::string &) = 0;
     virtual void showWidget() = 0;
     virtual void hideWidget() = 0;
-    virtual void changeViewVisibility(bool isVisible) = 0;
     virtual void suspendWidget()= 0;
     virtual void resumeWidget() = 0;
     virtual void resetWidget() = 0;
index 2e3d3c7..60fa610 100644 (file)
@@ -31,6 +31,7 @@ PKG_CHECK_MODULES(VIEW_MODULE_DEP
     security-core
     security-client
     haptic
+    sysman
     REQUIRED
 )
 
index b9e11ff..2a4ad92 100755 (executable)
@@ -33,6 +33,7 @@
 #include <appcore-common.h>
 #include <pcrecpp.h>
 #include <vconf.h>
+#include <sysman.h>
 #include <widget_model.h>
 #include <dpl/wrt-dao-ro/widget_dao_read_only.h>
 #include <dpl/wrt-dao-ro/vconf_config.h>
@@ -96,6 +97,9 @@ const char * const CERTIFICATE_CONFIRM_REQUEST_ASK_TITLE =
     "Certification Info";
 const char * const CERTIFICATE_CONFIRM_REQUEST_ASK_BODY =
     "This site's security certificate is not trusted! Do you acess this site?";
+
+const wchar_t* BACKGROUND_ENABLED = L"background_enabled" ;
+
 } // anonymous namespace
 
 std::map<const std::string, const Evas_Smart_Cb> ViewLogic::m_ewkCallbacksMap =
@@ -161,6 +165,7 @@ ViewLogic::ViewLogic():
     m_model(0),
     m_cbs(new WRT::UserDelegates),
     m_isBackgroundReload(false),
+    m_isBackgroundSupport(false),
     m_appsSupport(new ViewModule::AppsSupport()),
     m_vibrationSupport(new ViewModule::VibrationSupport()),
     m_attachedToCustomHandlerDao(false)
@@ -270,25 +275,6 @@ void ViewLogic::hideWidget()
     m_ewkViewList.clear();
 }
 
-void ViewLogic::changeViewVisibility(bool isVisible)
-{
-    Evas_Object* wkView = m_currentEwkView;
-    if (!wkView)
-        return;
-
-    if (isVisible) {
-        ewk_view_page_visibility_state_set(wkView,
-                                           EWK_PAGE_VISIBILITY_STATE_VISIBLE,
-                                           EINA_FALSE);
-        ewk_view_visibility_set(wkView, EINA_TRUE);
-    } else {
-        ewk_view_page_visibility_state_set(wkView,
-                                           EWK_PAGE_VISIBILITY_STATE_HIDDEN,
-                                           EINA_FALSE);
-        ewk_view_visibility_set(wkView, EINA_FALSE);
-    }
-}
-
 void ViewLogic::suspendWidget()
 {
     LogInfo("Pausing widget");
@@ -300,7 +286,10 @@ void ViewLogic::suspendWidget()
     if (!m_currentEwkView) {
         LogWarning("Cannot suspend widget without view");
     } else {
-        suspendWebkit(m_currentEwkView);
+        setEwkViewInvisible(m_currentEwkView);
+        if (!m_isBackgroundSupport) {
+            suspendWebkit(m_currentEwkView);
+        }
     }
 
     evas_object_focus_set(m_currentEwkView, EINA_FALSE);
@@ -320,7 +309,10 @@ void ViewLogic::resumeWidget()
     PluginModuleSupport::resume(m_ewkContext);
 
     if (m_currentEwkView) {
-        resumeWebkit(m_currentEwkView);
+        setEwkViewVisible(m_currentEwkView);
+        if (!m_isBackgroundSupport) {
+            resumeWebkit(m_currentEwkView);
+        }
     }
 
    /* window system team recomend removing this win_raise code. */
@@ -525,6 +517,30 @@ void ViewLogic::finalizeEwkContext()
 
 void ViewLogic::initializeSupport()
 {
+    // background support
+    if( m_model->SettingList.Get().getBackgroundSupport()
+        == BackgroundSupport_Enable ) {
+        LogDebug("Background support enabled, set process active");
+        pid_t pid = getpid();
+        sysman_inform_active(pid);
+        m_isBackgroundSupport = true;
+    }
+#ifndef DEPRECATED_SETTING_STRING
+    else {
+        WrtDB::WidgetDAOReadOnly dao(m_model->TizenId);
+        WrtDB::PropertyDAOReadOnly::WidgetPropertyValue bgEnableValue =
+            dao.getPropertyValue(DPL::String(BACKGROUND_ENABLED));
+
+        if(!bgEnableValue.IsNull() && !bgEnableValue->compare(L"true")) {
+            //skip suspendWidget
+            LogDebug("Background support enabled, set process active");
+            pid_t pid = getpid();
+            sysman_inform_active(pid);
+            m_isBackgroundSupport = true;
+        }
+    }
+#endif
+
     // set local stroage database path
     WrtDB::WidgetDAOReadOnly dao(m_model->TizenId);
     ewk_context_web_storage_path_set(m_ewkContext,
@@ -737,6 +753,28 @@ void ViewLogic::suspendEwkView(Evas_Object *wkView)
     return;
 }
 
+void ViewLogic::setEwkViewInvisible(Evas_Object *wkView)
+{
+    LogInfo("setEwkViewInvisible called");
+    Assert(wkView);
+
+    ewk_view_page_visibility_state_set(wkView,
+                                       EWK_PAGE_VISIBILITY_STATE_HIDDEN,
+                                       EINA_FALSE);
+    ewk_view_visibility_set(wkView, EINA_FALSE);
+}
+
+void ViewLogic::setEwkViewVisible(Evas_Object *wkView)
+{
+    LogInfo("setEwkViewVisible called");
+    Assert(wkView);
+
+    ewk_view_page_visibility_state_set(wkView,
+                                       EWK_PAGE_VISIBILITY_STATE_VISIBLE,
+                                       EINA_FALSE);
+    ewk_view_visibility_set(wkView, EINA_TRUE);
+}
+
 void ViewLogic::resumeWebkit(Evas_Object *wkView)
 {
     LogDebug("resumeWebkit");
@@ -750,10 +788,7 @@ void ViewLogic::resumeWebkit(Evas_Object *wkView)
     //      ewk_view_enable_render();
     //      ewk_view_reduce_plugins_frame_rate(false);
     ewk_view_resume(wkView);
-    ewk_view_visibility_set(wkView, EINA_TRUE);
-    ewk_view_page_visibility_state_set(wkView,
-                                       EWK_PAGE_VISIBILITY_STATE_VISIBLE,
-                                       EINA_FALSE);
+
     return;
 }
 
index 709a410..753a828 100755 (executable)
@@ -55,7 +55,6 @@ class ViewLogic : public ViewModule::IViewModule
     void prepareView(WidgetModel* m, const std::string &startUrl);
     void showWidget();
     void hideWidget();
-    void changeViewVisibility(bool isVisible);
     void suspendWidget();
     void resumeWidget();
     void resetWidget();
@@ -82,6 +81,8 @@ class ViewLogic : public ViewModule::IViewModule
     void removeEwkView(Evas_Object *wkView);
     void resumeEwkView(Evas_Object *wkView);
     void suspendEwkView(Evas_Object *wkView);
+    void setEwkViewVisible(Evas_Object *wkView);
+    void setEwkViewInvisible(Evas_Object *wkView);
     void resumeWebkit(Evas_Object *wkView);
     void suspendWebkit(Evas_Object *wkView);
 
@@ -302,6 +303,7 @@ class ViewLogic : public ViewModule::IViewModule
     size_t m_imeWidth;
     size_t m_imeHeight;
     bool m_isBackgroundReload;
+    bool m_isBackgroundSupport;
 
     std::unique_ptr<SchemeSupport> m_schemeSupport;
     std::unique_ptr<ViewModule::AppsSupport> m_appsSupport;