bug fix: TC-1975 25/31325/2
authorRyota Okubi <ryota.okubi@mail.toyota-td.jp>
Thu, 4 Dec 2014 05:11:59 +0000 (14:11 +0900)
committerMikko Ylinen <mikko.ylinen@intel.com>
Fri, 12 Dec 2014 07:52:42 +0000 (23:52 -0800)
ICO homescreen and last app start-up take too long

Change-Id: Id3a2b3e5d063e7220c62929e5114cde831b492e0
Bug-Tizen: TC-1975
Signed-off-by: Ryota Okubi <ryota.okubi@mail.toyota-td.jp>
lib/common/CicoEFLApp.cpp
src/homescreen/CicoHSAppHistory.cpp
src/homescreen/CicoHSAppHistory.h
src/homescreen/CicoHSAppHistoryExt.cpp
src/homescreen/CicoHSBackWindow.cpp
src/homescreen/CicoHSLifeCycleController.cpp
src/homescreen/CicoHSMenuWindow.cpp
src/homescreen/CicoHSWindowController.cpp
src/homescreen/CicoHSWindowController.h
src/homescreen/CicoHomeScreen.cpp
src/homescreen/CicoHomeScreen.h

index baa0613..089b117 100644 (file)
@@ -56,12 +56,13 @@ CicoEFLApp::CicoEFLApp()
         free(value);
     }
 
+#if 0   /* no need version number   */
     ret = app_get_version(&value);
     if (APP_ERROR_NONE == ret) {
         m_version = value;
         free(value);
     }
-
+#endif
 //    ICO_DBG("CicoEFLApp::CicoEFLApp Leave");
 }
 
@@ -80,8 +81,8 @@ CicoEFLApp::~CicoEFLApp()
 /**
  *  @brief  start EFL main loop
  *
- *  @param [in] argc    count of argument 
- *  @param [in] argv    variables of argument 
+ *  @param [in] argc    count of argument
+ *  @param [in] argv    variables of argument
  */
 //--------------------------------------------------------------------------
 int
@@ -285,7 +286,7 @@ CicoEFLApp::onLowBattery(void *user_data)
 
 //--------------------------------------------------------------------------
 /**
- *  @brief  callback function on device orientation 
+ *  @brief  callback function on device orientation
  *
  *  @param [in] orientation The orientation of device
  *  @param [in] user_data   The user data passed from the callback
@@ -349,8 +350,8 @@ CicoEFLApp::appfwCreateCB(void *user_data)
         ICO_DBG("CicoEFLApp::appfwCreateCB Leave");
         return false;
     }
-    
-    bool ret = static_cast<CicoEFLApp*>(user_data)->onCreate(user_data); 
+
+    bool ret = static_cast<CicoEFLApp*>(user_data)->onCreate(user_data);
 
     ICO_DBG("CicoEFLApp::appfwCreateCB Leave(%sd)", ret ? "true" : "false");
 
@@ -374,8 +375,8 @@ CicoEFLApp::appfwTerminateCB(void *user_data)
         ICO_DBG("CicoEFLApp::appfwTerminateCB Leave");
         return;
     }
-    
-    static_cast<CicoEFLApp*>(user_data)->onTerminate(user_data); 
+
+    static_cast<CicoEFLApp*>(user_data)->onTerminate(user_data);
 
     ICO_DBG("CicoEFLApp::appfwTerminateCB Leave");
 }
@@ -398,8 +399,8 @@ CicoEFLApp::appfwPauseCB(void *user_data)
         ICO_DBG("CicoEFLApp::appfwPauseCB Leave");
         return;
     }
-    
-    static_cast<CicoEFLApp*>(user_data)->onPause(user_data); 
+
+    static_cast<CicoEFLApp*>(user_data)->onPause(user_data);
 
     ICO_DBG("CicoEFLApp::appfwPauseCB Leave");
 }
@@ -421,8 +422,8 @@ CicoEFLApp::appfwResumeCB(void *user_data)
         ICO_DBG("CicoEFLApp::appfwResumeCB Leave");
         return;
     }
-    
-    static_cast<CicoEFLApp*>(user_data)->onResume(user_data); 
+
+    static_cast<CicoEFLApp*>(user_data)->onResume(user_data);
 
     ICO_DBG("CicoEFLApp::appfwResumeCB Leave");
 }
@@ -445,8 +446,8 @@ CicoEFLApp::appfwServiceCB(service_h service, void *user_data)
         ICO_DBG("CicoEFLApp::appfwServiceCB Leave");
         return;
     }
-    
-    static_cast<CicoEFLApp*>(user_data)->onService(service, user_data); 
+
+    static_cast<CicoEFLApp*>(user_data)->onService(service, user_data);
 
     ICO_DBG("CicoEFLApp::appfwServiceCB Leave");
 }
@@ -469,8 +470,8 @@ CicoEFLApp::appfwLowMemoryCB(void *user_data)
         return;
     }
 
-    static_cast<CicoEFLApp*>(user_data)->onLowMemory(user_data); 
+    static_cast<CicoEFLApp*>(user_data)->onLowMemory(user_data);
+
     ICO_DBG("CicoEFLApp::appfwLowMemoryCB Leave");
 }
 
@@ -491,8 +492,8 @@ CicoEFLApp::appfwLowBatteryCB(void *user_data)
         ICO_DBG("CicoEFLApp::appfwLowBatteryCB Leave");
         return;
     }
-    static_cast<CicoEFLApp*>(user_data)->onLowBattery(user_data); 
+
+    static_cast<CicoEFLApp*>(user_data)->onLowBattery(user_data);
 
     ICO_DBG("CicoEFLApp::appfwLowBatteryCB Leave");
 }
@@ -516,7 +517,7 @@ CicoEFLApp::appfwDeviceOrientationCB(app_device_orientation_e orientation,
         ICO_DBG("CicoEFLApp::appfwDeviceOrientationCB Leave");
         return;
     }
+
     static_cast<CicoEFLApp*>(user_data)->onDeviceOrientation(orientation,
                                                              user_data);
 
@@ -540,7 +541,7 @@ CicoEFLApp::appfwLanguageChangedCB(void *user_data)
         ICO_DBG("CicoEFLApp::appfwDeviceOrientationCB Leave");
         return;
     }
+
     static_cast<CicoEFLApp*>(user_data)->onLanguageChanged(user_data);
 
     ICO_DBG("CicoEFLApp::appfwLanguageChangedCB Leave");
@@ -563,7 +564,7 @@ CicoEFLApp::appfwRegionFormatChangedCB(void *user_data)
         ICO_DBG("CicoEFLApp::appfwDeviceOrientationCB Leave");
         return;
     }
+
     static_cast<CicoEFLApp*>(user_data)->onRegionFormatChanged(user_data);
 
     ICO_DBG("CicoEFLApp::appfwRegionFormatChangedCB Leave");
index 828a6a6..0c3ce65 100644 (file)
@@ -40,6 +40,8 @@ CicoHSAppHistory::CicoHSAppHistory()
     m_pathD.clear();
     m_flagPath.clear();
     m_hs = NULL;
+    m_startupApp[0] = 0;
+    m_callback_startup = NULL;
     homeSwipe();
 }
 
@@ -55,6 +57,8 @@ CicoHSAppHistory::CicoHSAppHistory(const char* user, const char* path,
 {
     ICO_DBG("constructor %s, %s", user, path, pathD, flagpath);
     m_hs = NULL;
+    m_startupApp[0] = 0;
+    m_callback_startup = NULL;
     homeSwipe();
 }
 
@@ -70,6 +74,8 @@ CicoHSAppHistory::CicoHSAppHistory(const string& user, const string& path,
 {
     ICO_DBG("constructor %s, %s", user.c_str(), flagpath.c_str());
     m_hs = NULL;
+    m_startupApp[0] = 0;
+    m_callback_startup = NULL;
     homeSwipe();
 }
 
@@ -87,6 +93,18 @@ CicoHSAppHistory::~CicoHSAppHistory()
 }
 
 /**
+ * @brief set startup callback function
+ * @param callback      callback function
+ * @param arg           argument of callback function
+ * @ret none
+ */
+void CicoHSAppHistory::setCallbackStartup(history_callback_startup_t callback, void *arg)
+{
+    m_callback_arg = arg;
+    m_callback_startup = callback;
+}
+
+/**
  * @brief added application id to list
  * @param app target application id
  * @ret bool
@@ -96,13 +114,21 @@ CicoHSAppHistory::~CicoHSAppHistory()
 bool CicoHSAppHistory::addAppHistory(const string& app)
 {
     const char* tgt = app.c_str();
-    ICO_TRA("start(%s, %d)", tgt, (int)m_appHistoryList.size());
+    ICO_TRA("start(%s, %d) %s", tgt, (int)m_appHistoryList.size(), m_startupApp);
     if (true == filterChk(m_filterM, tgt)) {
        ICO_TRA("end false");
        return false;
     }
     m_appHistoryList.remove(app);
-    m_appHistoryList.push_front(app);
+    if (m_startupApp[0] != 0)   {
+        m_appHistoryList.push_back(app);
+    }
+    else    {
+        m_appHistoryList.push_front(app);
+    }
+    if (m_callback_startup) {
+        (*m_callback_startup)(m_callback_arg, tgt, false);
+    }
     homeSwipe();
     ICO_TRA("end (true, %d)", (int)m_appHistoryList.size());
     return true;
@@ -129,6 +155,9 @@ bool CicoHSAppHistory::delAppHistory(const string& app)
             homeSwipe();
         }
     }
+    if (m_callback_startup) {
+        (*m_callback_startup)(m_callback_arg, app.c_str(), true);
+    }
     ICO_TRA("end(%s, %d)", r? "true": "false", sz);
     return r;
 }
@@ -284,6 +313,18 @@ bool CicoHSAppHistory::writeAppHistory()
 }
 
 /**
+ * @brief set startup last appid
+ */
+void CicoHSAppHistory::setStartupApp(const char *appid)
+{
+    memset(m_startupApp, 0, sizeof(m_startupApp));
+    if (appid != NULL)  {
+        strncpy(m_startupApp, appid, sizeof(m_startupApp)-1);
+    }
+    ICO_DBG("setStartupApp<%s>", m_startupApp);
+}
+
+/**
  * @brief string match check
  * @param filter string chek targets
  * @param tgt string chek target
index 9790614..460be3c 100644 (file)
 #include <list>
 #include <vector>
 #include <utility>
+#include "CicoHomeScreenCommon.h"
 
 #define DEF_SUBDISPLAY_TAG ":SUBDISPLAY"
 
 typedef std::pair<std::string, bool> pairAppidSubd;
+typedef void (*history_callback_startup_t) (void *arg, const char *appid, bool down);
 
 class CicoHomeScreen;
 
@@ -60,6 +62,10 @@ public:
     bool readAppHistory(std::vector<pairAppidSubd>& apps);
     bool writeAppHistory();
     void setHomeScreen(CicoHomeScreen* p);
+    const char *getStartupApp(void);
+    void setStartupApp(const char *appid);
+    void setCallbackStartup(history_callback_startup_t callback, void *arg);
+
 protected:
     bool filterChk(std::vector<std::string>& filter, const char* tgt) const;
     const char* getAppidSubDispBySystem() const;
@@ -75,6 +81,9 @@ protected:
     std::list<std::string>::iterator m_swipeCurr;
     std::string         m_swipeStr;
     CicoHomeScreen*     m_hs;
+    char                m_startupApp[ICO_HS_MAX_PROCESS_NAME];
+    history_callback_startup_t  m_callback_startup;
+    void                *m_callback_arg;
 };
 
 /**
@@ -106,7 +115,7 @@ inline const std::string& CicoHSAppHistory::getPathDef() const
 
 /**
  * @brief get history appid list
- * @ret list<string> 
+ * @ret list<string>
  */
 inline const std::list<std::string>& CicoHSAppHistory::getAppHistory() const
 {
@@ -131,10 +140,23 @@ inline void CicoHSAppHistory::setFilterWrite(std::vector<std::string>& filter)
     m_filterW = filter;   // history write filter string
 }
 
+/**
+ * @brief set homescreen instance
+ * @param homescreen instance
+ */
 inline void CicoHSAppHistory::setHomeScreen(CicoHomeScreen* hs)
 {
     m_hs = hs;
 }
 
+/**
+ * @brief get StartupMode
+ * @ret last application appid or null if not startup mode
+ */
+inline const char *CicoHSAppHistory::getStartupApp(void)
+{
+    return (m_startupApp[0] ? m_startupApp : NULL);
+}
+
 #endif // CICOHSAPPHISTORY_H
 // vim: set expandtab ts=4 sw=4:
index 74042a3..cd1c21e 100644 (file)
@@ -50,7 +50,7 @@ static int ico_CHSAHapp_launch_handler(int pid, void *data)
         return -1;
     }
     CicoHSAppHistoryExt *o = (CicoHSAppHistoryExt*) data;
-    char appid[255];
+    char appid[ICO_HS_MAX_PROCESS_NAME];
     memset(appid, 0, sizeof(appid));
     int iR = Xaul_app_get_appid_bypid(pid, appid, sizeof(appid));
     ICO_PRF("CHG_APP_STA 1.notice  app=%s, pid=%d, rval=%d", appid, pid, iR);
@@ -483,7 +483,7 @@ void CicoHSAppHistoryExt::update_appid(int pid, string& appid, int& aulstt)
         return;
     }
     ICO_TRA("update start %d", aulstt);
-    char buf[255];
+    char buf[ICO_HS_MAX_PROCESS_NAME];
     buf[0] = '\0'; // STOP CODE
     aulstt = aul_app_get_appid_bypid(pid, buf, sizeof(buf));
     if (AUL_R_OK == aulstt) {
@@ -718,16 +718,19 @@ void CicoHSAppHistoryExt::update_appid()
  * @param appid
  * @param display posi
  */
-void CicoHSAppHistoryExt::startupCheckAdd(int pid, const std::string& appid,
-                                          bool d)
+void CicoHSAppHistoryExt::startupCheckAdd(int pid, const std::string& appid, bool d)
 {
     ICO_DBG("add pid=%d, appid=%s", pid, appid.c_str());
     m_vpbpa.push_back(pairBoolPidAppid(false, pairPidAppid(pid, appid)));
-    if (true == d) {
-        m_subDispApp = appid;
-    }
-    else {
-        m_lastStartupApp = appid;
+    const char *lastapp = getStartupApp();
+    if ((lastapp == NULL) ||
+        (strncmp(lastapp, appid.c_str(), ICO_HS_MAX_PROCESS_NAME) == 0))    {
+        if (true == d) {
+            m_subDispApp = appid;
+        }
+        else {
+            m_lastStartupApp = appid;
+        }
     }
 }
 
index 2250a1a..76a7dc9 100644 (file)
@@ -14,6 +14,7 @@
 #include <tzplatform_config.h>
 #include "CicoHSBackWindow.h"
 #include "CicoResourceConfig.h"
+#include "CicoHSWindowController.h"
 
 /*============================================================================*/
 /* functions                                                                  */
@@ -67,9 +68,18 @@ CicoHSBackWindow::CreateBackWindow(int pos_x,int pos_y,int width,int height)
     int ret;
 
     /*create window*/
-    ret = CreateWindow(ICO_HS_BACK_WINDOW_TITLE, pos_x, pos_y, width, height, EINA_TRUE);
-    if(ret != ICO_OK){
-       return ret;
+    window = CicoHSWindowController::GetBaseEvas();
+    if (window) {
+        ecore_evas_move_resize(window, pos_x, pos_y, width, height);
+        strncpy(this->title, ICO_HS_BACK_WINDOW_TITLE, ICO_MAX_TITLE_NAME_LEN);
+        ecore_evas_title_set(window, this->title);
+        ecore_evas_alpha_set(window, EINA_TRUE);
+    }
+    else    {
+        ret = CreateWindow(ICO_HS_BACK_WINDOW_TITLE, pos_x, pos_y, width, height, EINA_TRUE);
+        if(ret != ICO_OK){
+            return ret;
+        }
     }
 
     /* evas get */
@@ -136,6 +146,8 @@ void
 CicoHSBackWindow::FreeBackWindow(void)
 {
     evas_object_del(canvas);
-    FreeWindow();
+    if (window != CicoHSWindowController::GetBaseEvas())    {
+        FreeWindow();
+    }
 }
 // vim: set expandtab ts=4 sw=4:
index 2843d7a..d7c59b8 100644 (file)
@@ -22,6 +22,7 @@
 #include "CicoAilItems.h"
 #include "CicoHSLifeCycleController.h"
 #include "CicoConf.h"
+#include "CicoHomeScreenCommon.h"
 #include "CicoSystemConfig.h"
 #include "Cico_aul_listen_app.h"
 
@@ -367,29 +368,16 @@ int CicoHSLifeCycleController::suspend(int pid)
 bool CicoHSLifeCycleController::isRunning(const char* appid)
 {
     bool r = false;
-#if 0 // TODO mk_k
-    vector<CicoAulItems>::iterator it = m_aul.begin();
-    while (it != m_aul.end()) {
-        it->update_appid();
-        ICO_DBG("%s == %s", it->m_appid.c_str(), appid);
-        if (it->m_appid == appid) {
-            r = true;
-            break;  // break of while it
-        }
-        ++it;
-    }
-#else
     int sz = m_aul.size();
     for (int i = 0; i < sz; i++) {
         m_aul[i].update_appid();
-//      ICO_DBG("%s == %s", m_aul[i].m_appid.c_str(), appid);
         if (m_aul[i].m_appid == appid) {
             r = true;
             break;
         }
     }
-#endif
-    ICO_TRA("CicoHSLifeCycleController::isRunning %s=%s", appid, r ? "true" : "false");
+    if (r == false)
+        ICO_TRA("CicoHSLifeCycleController::isRunning %s=false", appid);
     return r;
 }
 
@@ -537,7 +525,7 @@ int CSCLCCpkgmgr_handlerX(int req_id, const char *pkg_type, const char *pkg_name
                          CicoHSLifeCycleController* x)
 {
 // TODO mk_k
-    ICO_TRA("pkgmgr t:%s, n:%s, k:%s, v:%s, m:%s",pkg_type, pkg_name, key,
+    ICO_TRA("pkgmgr Enter t:%s, n:%s, k:%s, v:%s, m:%s",pkg_type, pkg_name, key,
             val, pmsg);
     if ((NULL == x) || (0 == x)) {
         ICO_TRA("end user data none");
@@ -549,6 +537,7 @@ int CSCLCCpkgmgr_handlerX(int req_id, const char *pkg_type, const char *pkg_name
             x->renewAIL();
         }
     }
+    ICO_TRA("pkgmgr Leave");
     return 0;
 // TODO mk_k
 }
@@ -558,6 +547,7 @@ int CSCLCCpkgmgr_handlerX(int req_id, const char *pkg_type, const char *pkg_name
  */
 void CicoHSLifeCycleController::renewAIL()
 {
+    ICO_DBG("void CicoHSLifeCycleController::renewAIL Enter");
     vector<CicoAilItems> old = m_ail;
     m_ail.clear();
     int cnt =0;
@@ -612,6 +602,8 @@ void CicoHSLifeCycleController::renewAIL()
 #endif
     old.clear();
     ailRenewFlagOn();
+
+    ICO_DBG("void CicoHSLifeCycleController::renewAIL Leave");
     return;
 }
 
@@ -643,26 +635,40 @@ ail_cb_ret_e CSCLCCail_list_appinfo_cbX(const ail_appinfo_h appinfo,
     if (strcmp(pkg, APP_CONF_AIL_NULL_STR) == 0) {
         pkg = NULL;
     }
-    /* get icon path */
-    ail_appinfo_get_usr_str(appinfo, AIL_PROP_ICON_STR, uid, &icn);
-    if (strcmp(icn, APP_CONF_AIL_NULL_STR) == 0) {
+    /* get exec */
+    ail_appinfo_get_usr_str(appinfo, AIL_PROP_EXEC_STR, uid, &exe);
+    if (strcmp(exe, APP_CONF_AIL_NULL_STR) == 0) {
+        exe = NULL;
+    }
+    /* if not display on menu, no need icon ... */
+    ail_appinfo_get_bool(appinfo, AIL_PROP_NODISPLAY_BOOL, &bndsp);
+    if (bndsp == true)  {
+        /* not display */
         icn = NULL;
+        exe = NULL;
     }
-    else if (icn != NULL) {
-        struct stat buff;
-        /* file check */
-        memset(&buff, 0, sizeof(buff));
-        if (stat(icn, &buff) == 0) {
-            if (S_ISDIR(buff.st_mode)) {
-                /* is directory */
-                ICO_DBG("%s is directory", icn);
+    else    {
+        /* get icon path */
+        ail_appinfo_get_usr_str(appinfo, AIL_PROP_ICON_STR, uid, &icn);
+        if (strcmp(icn, APP_CONF_AIL_NULL_STR) == 0) {
+            icn = NULL;
+        }
+        else if (icn != NULL) {
+            struct stat buff;
+            /* file check */
+            memset(&buff, 0, sizeof(buff));
+            if (stat(icn, &buff) == 0) {
+                if (S_ISDIR(buff.st_mode)) {
+                    /* is directory */
+                    ICO_DBG("%s is directory", icn);
+                    icn = NULL;
+                }
+            }
+            else {
+                /* is not exist */
                 icn = NULL;
             }
         }
-        else {
-            /* is not exist */
-            icn = NULL;
-        }
     }
     /* get name */
     ail_appinfo_get_usr_str(appinfo, AIL_PROP_NAME_STR, uid, &nm);
@@ -674,17 +680,8 @@ ail_cb_ret_e CSCLCCail_list_appinfo_cbX(const ail_appinfo_h appinfo,
     if (strcmp(ctgry, APP_CONF_AIL_NULL_STR) == 0) {
         ctgry = NULL;
     }
-    /* get type */
-    ail_appinfo_get_usr_str(appinfo, AIL_PROP_TYPE_STR, uid, &typ);
-    if (strcmp(typ, APP_CONF_AIL_NULL_STR) == 0) {
-        typ = NULL;
-    }
-    /* get exec */
-    ail_appinfo_get_usr_str(appinfo, AIL_PROP_EXEC_STR, uid, &exe);
-    if (strcmp(exe, APP_CONF_AIL_NULL_STR) == 0) {
-        exe = NULL;
-    }
-    ail_appinfo_get_bool(appinfo, AIL_PROP_NODISPLAY_BOOL, &bndsp);
+    /* type is fixed application    */
+    typ = NULL;
     ICO_DBG("pkg:%s icn:%s nm:%s ctg:%s ty:%s exe:%s ds:%s", pkg? pkg:DNil,
             icn? icn:DNil, nm? nm:DNil, ctgry? ctgry:DNil, typ? typ:DNil,
             exe? exe:DNil, bndsp? "true":"false");
@@ -726,6 +723,7 @@ bool CicoHSLifeCycleController::createAilItems()
 
     int r;
     uid_t uid = getuid();
+
     ail_filter_h fil;
     ail_filter_new(&fil);
     r = ail_filter_add_str(fil, AIL_PROP_TYPE_STR, DAilTypeFilPrm_Menu);
@@ -938,7 +936,7 @@ int CSCLCCapp_launch_handlerX(int pid, CicoHSLifeCycleController* x)
         ICO_TRA("end fail(user data is NULL)");
         return -1;
     }
-    char appid[255];
+    char appid[ICO_HS_MAX_PROCESS_NAME];
     memset(appid, 0, sizeof(appid));
     int iR = Xaul_app_get_appid_bypid(pid, appid, sizeof(appid));
     ICO_PRF("CHG_APP_STA   notice  app=%s, pid=%d, rval=%d", appid, pid, iR);
index 2924ab9..e316ce3 100644 (file)
@@ -41,6 +41,8 @@ int  CicoHSMenuWindow::menu_tile_height = 290;
 /*--------------------------------------------------------------------------*/
 CicoHSMenuWindow::CicoHSMenuWindow(void)
 {
+    ICO_DBG("CicoHSMenuWindow::CicoHSMenuWindow Enter");
+
     /*initialzie values*/
     terminate_mode = false;
 
@@ -82,6 +84,8 @@ CicoHSMenuWindow::CicoHSMenuWindow(void)
     CicoResourceConfig::GetImagePath(img_dir_path, ICO_HS_MAX_PATH_BUFF_LEN);
 
     m_showState = false;
+
+    ICO_DBG("CicoHSMenuWindow::CicoHSMenuWindow Leave");
 }
 
 /*--------------------------------------------------------------------------*/
@@ -111,6 +115,8 @@ int
 CicoHSMenuWindow::SetMenuBack(void)
 {
     /* set menu back */
+    ICO_TRA("CicoHSMenuWindow::SetMenuBack Enter");
+
     /* set object*/
     if (transparent_background) {
         /* image file name*/
@@ -330,10 +336,10 @@ CicoHSMenuWindow::SetAppTiles(void)
                                           ICO_HS_DEFAULT_MENU_CATEGORY_FILE_PATH);
     }
     GetCategory(category_path, category, &category_num);
-    ICO_DBG("CicoHSMenuWindow::SetAppTiles :category_num %d", category_num);
+    ICO_DBG("CicoHSMenuWindow::SetAppTiles category_num %d", category_num);
 
     for (int ii = 0; ii < category_num ; ii++) {
-       ICO_DBG("CicoHSMenuWindow::SetAppTiles :category[%d] %d", ii, category[ii]);
+       ICO_DBG("CicoHSMenuWindow::SetAppTiles category[%d] %d", ii, category[ii]);
     }
 
     /* other category add */
@@ -357,16 +363,15 @@ CicoHSMenuWindow::SetAppTiles(void)
     for (unsigned int ii = 0; ii < aillist.size(); ii++) {
 
         /*all application num*/
-        if((aillist[ii].m_noIcon) ||
-                (strcmp(aillist[ii].m_group.c_str(),
-                ICO_HS_GROUP_SPECIAL) == 0)) {
-            ICO_DBG("CicoHSMenuWindow::SetAppTiles :ignore app appid = [%s] noIcon = [%d]",
+        if ((aillist[ii].m_noIcon) ||
+            (strcmp(aillist[ii].m_group.c_str(), ICO_HS_GROUP_SPECIAL) == 0)) {
+            ICO_DBG("CicoHSMenuWindow::SetAppTiles ignore app appid = [%s] noIcon = [%d]",
                     aillist[ii].m_appid.c_str(),aillist[ii].m_noIcon);
             continue;
         }
-        ICO_DBG("CicoHSMenuWindow::SetAppTiles :SetApp appid = [%s] noIcon =[%d]",
+        ICO_DBG("CicoHSMenuWindow::SetAppTiles SetApp appid = [%s] noIcon =[%d]",
                 aillist[ii].m_appid.c_str(),aillist[ii].m_noIcon);
-        ICO_DBG("CicoHSMenuWindow::SetAppTile :aillist[%d].m_categoryID = [%d]",
+        ICO_DBG("CicoHSMenuWindow::SetAppTileaillist[%d].m_categoryID = [%d]",
                 ii, aillist[ii].m_categoryID);
 
         /* Categories */
@@ -1443,6 +1448,10 @@ CicoHSMenuWindow::Show(ico_syc_animation_t *animation)
     if (true == CicoHSSystemState::getInstance()->getRegulation()) {
         return;
     }
+    // it ignores, if the menu has not been completed yet.
+    if (surface == 0)   {
+        return;
+    }
     m_showState = true;
 
     if (true == life_cycle_controller->isAilRenew()) {
@@ -1457,7 +1466,7 @@ CicoHSMenuWindow::Show(ico_syc_animation_t *animation)
             menu_tile[ii]->ShowMenu(true);
         }
     }
-
+    ICO_DBG("show %08x %s(show menu)", surface, appid);
     ico_syc_show(appid, surface, animation);
 
     ICO_TRA("CicoHSMenuWindow::Show Leave");
@@ -1477,11 +1486,16 @@ CicoHSMenuWindow::Hide(ico_syc_animation_t *animation)
 {
     ICO_TRA("CicoHSMenuWindow::Hide Enter");
 
+    // it ignores, if the menu has not been completed yet.
+    if (surface == 0)   {
+        return;
+    }
     if(terminate_mode == true){
         ChangeNormalMode();
     }
     m_showState = false;
     if (surface)    {
+    ICO_DBG("hide %08x %s(hide menu)", surface, appid);
         ico_syc_hide(appid, surface, animation);
     }
 
index 52e4c28..03370da 100644 (file)
@@ -51,10 +51,20 @@ void
 CicoHSWindowController::Initialize(void)
 {
     int ret;
+
+    ICO_DBG("CicoHSWindowController::Initialize: Enter");
+
     /* Reset a ecore_evas */
     ret = ecore_evas_init();
-    ICO_DBG("CicoHSWindowController::Initialize: ecore_evas_init retrun %d",
-            ret);
+    ICO_DBG("CicoHSWindowController::Initialize: ecore_evas_init retrun %d", ret);
+    ms_ecoreEvas = ecore_evas_new(NULL, 0, 0, 1, 1, "frame=0");
+    ICO_DBG("CicoHSWindowController::Initialize: Leave");
+}
+
+Ecore_Evas *
+CicoHSWindowController::GetBaseEvas(void)
+{
+    return CicoHSWindowController::ms_ecoreEvas;
 }
 
 /*--------------------------------------------------------------------------*/
@@ -93,8 +103,6 @@ CicoHSWindowController::GetFullScreenSize(int orientation,
     int display_width  = 0;
     int display_height = 0;
 
-    ms_ecoreEvas = ecore_evas_new(NULL, 0, 0, 1, 1, "frame=0");
-
     /* getting size of screen */
     /* home screen size is full of display*/
     ecore_wl_screen_size_get(&display_width, &display_height);
@@ -102,23 +110,9 @@ CicoHSWindowController::GetFullScreenSize(int orientation,
     ICO_DBG("ecore_wl_screen_size_get => w/h=%d/%d",
             display_width, display_height);
 
-#if 1           /* TizenIVI 3.0 ecore return correct display size   */
     *width = display_width;
     *height = display_height;
-#else           /* TizenIVI 3.0 ecore return correct display size   */
-    if (orientation == ICO_ORIENTATION_VERTICAL) {
-        *width = display_width > display_height ?
-                                 display_height : display_width;
-        *height = (display_width > display_height ?
-                                 display_width : display_height);
-    }
-    else {
-        *width = display_width < display_height ?
-                                 display_height : display_width;
-        *height = (display_width < display_height ?
-                                   display_width : display_height);
-    }
-#endif          /* TizenIVI 3.0 ecore return correct display size   */
+
     ICO_TRA("CicoHSWindowController::GetFullScreenSize Leave(w/h=%d/%d)", *width, *height);
 }
 // vim:set expandtab ts=4 sw=4:
index 4218b36..4a5dec2 100644 (file)
@@ -35,6 +35,7 @@ class CicoHSWindowController
     static void Initialize(void);
     static void Finalize(void);
     static void GetFullScreenSize(int orientation,int *width,int *height);
+    static Ecore_Evas *GetBaseEvas(void);
 
   protected:
     CicoHSWindowController operator=(const CicoHSWindowController&);
index 4de972a..10ff2d4 100644 (file)
@@ -40,11 +40,17 @@ CicoHomeScreen * CicoHomeScreen::hs_instance;
 /**
  * ecore timer void data typedef
  */
-typedef struct t_launcApps_data {
-    string filePath;
-    string filePathD;
-    CicoHomeScreen *hs;
-} launcApps_data_t;
+typedef struct t_launchApps_data {
+    struct t_launchApps_data    *next;
+    char        appid[ICO_HS_MAX_PROCESS_NAME];
+    bool        bFlag;
+    bool        done;
+    short       i;
+    CicoHomeScreen      *hs;
+    CicoHSAppHistoryExt *hist;
+} launchApps_data_t;
+
+static  launchApps_data_t   *m_launchApps = NULL;
 
 /*--------------------------------------------------------------------------*/
 /**
@@ -285,6 +291,7 @@ CicoHomeScreen::ChangeActive(const char * appid, int surface)
         hs_instance->SetActiveAppInfo(appid);
         hs_instance->setActiveApp(appid);
         ICO_TRA("CicoHomeScreen::ChangeActive set show");
+        ICO_DBG("show %08x %s(active)", surface, appid);
         ico_syc_show(appid, surface, NULL);
         ico_syc_change_active(appid, surface);
     }
@@ -664,9 +671,11 @@ CicoHomeScreen::ShowHomeScreenWindow(ico_syc_win_info_t *win_info)
     if ((strncmp(win_info->name,ICO_HS_MENU_WINDOW_TITLE,
                  ICO_MAX_TITLE_NAME_LEN) == 0) &&
         (GetMode() == ICO_HS_MODE_APPLICATION)) {
+        ICO_DBG("hide %08x %s(menu)", win_info->surface, win_info->appid);
         ico_syc_hide(win_info->appid, win_info->surface, NULL);
         return;
     }
+    ICO_DBG("show %08x %s(app)", win_info->surface, win_info->appid);
     ico_syc_show(win_info->appid, win_info->surface, NULL);
 }
 
@@ -697,6 +706,7 @@ CicoHomeScreen::ShowStatusBarWindow(ico_syc_win_info_t *win_info)
             win_info->name,win_info->surface,move.pos_x,move.pos_y,
             move.width,move.height);
     ico_syc_move(win_info->appid,win_info->surface,&move,NULL);
+    ICO_DBG("show %08x %s(statusbar)", win_info->surface, win_info->appid);
     ico_syc_show(win_info->appid, win_info->surface,NULL);
 }
 
@@ -752,25 +762,38 @@ CicoHomeScreen::ShowApplicationWindow(ico_syc_win_info_t *win_info)
     ico_syc_animation_t animation;
     animation.name = ICO_HS_MENU_HIDE_ANIMATION_FADE;
     animation.time = ICO_HS_MENU_ANIMATION_DURATION;
-    const string& lastStartupApp = m_appHis->getLastStartupAppid();
-    if (true == lastStartupApp.empty()) {
-        ICO_DBG("show (empty) %s", win_info->appid);
-        ico_syc_show(win_info->appid, win_info->surface, &animation);
-    }
-    else {
-        bool bShow = false;
-        if (0 == lastStartupApp.compare(win_info->appid)) {
-            bShow = true;
-        }
-        if (true == bShow) {
-            ICO_DBG("show (last) %s", win_info->appid);
+
+    const char *lastapp = m_appHis->getStartupApp();
+    if (lastapp == NULL)    {
+        const string& lastStartupApp = m_appHis->getLastStartupAppid();
+        if (true == lastStartupApp.empty()) {
+            ICO_DBG("show %08x %s(empty)", win_info->surface, win_info->appid);
             ico_syc_show(win_info->appid, win_info->surface, &animation);
         }
         else {
-            ICO_DBG("hide (no last) %s", win_info->appid);
-            ico_syc_hide(win_info->appid, win_info->surface, &animation);
+            bool bShow = false;
+            if (0 == lastStartupApp.compare(win_info->appid)) {
+                bShow = true;
+            }
+            if (true == bShow) {
+                ICO_DBG("show %08x %s(last or not startup)",
+                        win_info->surface, win_info->appid);
+                ico_syc_show(win_info->appid, win_info->surface, &animation);
+            }
+            else {
+                ICO_DBG("hide %08x %s(not last)", win_info->surface, win_info->appid);
+                ico_syc_hide(win_info->appid, win_info->surface, &animation);
+            }
         }
     }
+    else if (strncmp(lastapp, win_info->appid, ICO_HS_MAX_PROCESS_NAME) == 0)   {
+        ICO_DBG("show %08x %s(startup last)", win_info->surface, win_info->appid);
+        ico_syc_show(win_info->appid, win_info->surface, &animation);
+    }
+    else    {
+        ICO_DBG("hide %08x %s(startup not last)", win_info->surface, win_info->appid);
+        ico_syc_hide(win_info->appid, win_info->surface, &animation);
+    }
     ICO_TRA("CicoHomeScreen::ShowApplicationWindow Leave");
 }
 
@@ -787,6 +810,7 @@ CicoHomeScreen::ShowApplicationWindow(ico_syc_win_info_t *win_info)
 void
 CicoHomeScreen::RaiseApplicationWindow(const char *appid,int surface)
 {
+    ICO_DBG("show %08x %s(raise)", surface, appid);
     ico_syc_show(appid, surface, NULL);
     ico_syc_change_active(appid, surface);
     hs_instance->SetActiveAppInfo(appid);
@@ -884,7 +908,6 @@ CicoHomeScreen::EventCallBack(const ico_syc_ev_e event,
             animation.name = ICO_HS_MENU_SHOW_ANIMATION_SLIDE;
             animation.time = ICO_HS_MENU_ANIMATION_DURATION;
             ico_syc_move(win_info->appid, win_info->surface, &move, &animation);
-
         }
         else    {
             /*Application*/
@@ -895,11 +918,14 @@ CicoHomeScreen::EventCallBack(const ico_syc_ev_e event,
             appinfo->AddWindowInfo(win_info);
 
             appinfo->SetLastSurface(win_info->surface);
+            const char *lastapp = hs_instance->m_appHis->getStartupApp();
             hs_instance->ShowApplicationWindow(win_info);
-            ico_syc_change_active(win_info->appid,win_info->surface);
+            if ((lastapp == NULL) ||
+                (strncmp(lastapp, win_info->appid, ICO_HS_MAX_PROCESS_NAME) == 0))  {
+                ico_syc_change_active(win_info->appid, win_info->surface);
+            }
             hs_instance->SetActiveAppInfo(win_info->appid);
             hs_instance->UpdateTile(win_info->appid);
-
             hs_instance->startupCheck(win_info->appid);
         }
     }
@@ -1073,10 +1099,13 @@ CicoHomeScreen::EventCallBack(const ico_syc_ev_e event,
                     }
                 }
             }
-
             // update window information
             appinfo->AddWindowAttr(win_attr);
             hs_instance->UpdateTile(win_attr->appid);
+
+            if (hs_instance->m_appHis->getStartupApp() != NULL) {
+                hs_instance->launchNextApps(win_attr->appid);
+            }
         }
     }
     else if (event == ICO_SYC_EV_THUMB_CHANGE)  {
@@ -1088,8 +1117,6 @@ CicoHomeScreen::EventCallBack(const ico_syc_ev_e event,
                     "no appinfo", thumb_info->appid, thumb_info->surface);
             return;
         }
-//      ICO_DBG("CicoHomeScreen::EventCallBack : ICO_SYC_EV_THUMB_CHANGE %s(%02x)",
-//              thumb_info->appid, thumb_info->surface);
         // show thumbnail icon
         hs_instance->menu_window->SetThumbnail(thumb_info->appid, thumb_info);
     }
@@ -1175,133 +1202,44 @@ CicoHomeScreen::EventCallBack(const ico_syc_ev_e event,
  * @brief   CicoHomeScreen::StartRelations
  *          Execute Onscreen and Statusbar
  *
- * @param[in]   none
- * @return      OK
+ * @param[in]   seq     0=start starusbar/1=start onscreen
+ * @return      none
  */
 /*--------------------------------------------------------------------------*/
-int
-CicoHomeScreen::StartRelations(void)
+void
+CicoHomeScreen::StartRelations(int seq)
 {
     int ret;
 
-    strncpy(sb_package_name,
-            config->ConfigGetString(ICO_HS_CONFIG_HOMESCREEN,
-                                    ICO_HS_CONFIG_SB,
-                                    ICO_HS_APPID_DEFAULT_SB),
-            ICO_HS_MAX_PROCESS_NAME);
-    strncpy(os_package_name,
-            config->ConfigGetString(ICO_HS_CONFIG_HOMESCREEN,
-                                    ICO_HS_CONFIG_ONS,
-                                    ICO_HS_APPID_DEFAULT_ONS),
-            ICO_HS_MAX_PROCESS_NAME);
-
-    /* start onscreen & statusbar apps */
-    os_app_info = GetAppInfo(os_package_name);
-    ret = os_app_info->Execute();
-    if (ret < 0) {
-        ICO_WRN("execute failed(%s) err=%d", os_package_name, ret);
-    }
-
-    sb_app_info = GetAppInfo(sb_package_name);
-    ret = sb_app_info->Execute();
-    if (ret < 0) {
-        ICO_WRN("execute failed(%s) err=%d", sb_package_name, ret);
-    }
-    return ICO_OK;
-}
-
-/*--------------------------------------------------------------------------*/
-/**
- * @brief   CicoHomeScreen::Initialize
- *          Initialize
- *
- * @param[in]   orientation    vertical or horizontal
- * @param[in]   config         config
- * @return      OK or ERROR
- */
-/*--------------------------------------------------------------------------*/
-int
-CicoHomeScreen::Initialize(int orientation, CicoGKeyFileConfig *config)
-{
-
-    ICO_DBG("CicoHomeScreen::Initialize: start");
-    /*save instance pointer */
-    hs_instance = this;
-
-    /*config copy*/
-    this->config = new CicoGKeyFileConfig();
-    this->config->Initialize(ICO_HOMESCREEN_CONFIG_FILE, ICO_SYC_PACKAGE_HOMESCREEN);
-
-    /*Get application info*/
-    CreateAppInfoList();
+    if (seq == 0)   {
+        strncpy(sb_package_name,
+                config->ConfigGetString(ICO_HS_CONFIG_HOMESCREEN,
+                                        ICO_HS_CONFIG_SB,
+                                        ICO_HS_APPID_DEFAULT_SB),
+                ICO_HS_MAX_PROCESS_NAME);
 
-    /* get pkg name (home screen,status bar,on screen)*/
-    char *pkg;
-    ICO_DBG("CicoHomeSceen::Initialize: %s: %s",
-            getenv("HOME"), getenv("PKG_NAME"));
-    pkg = getenv("PKG_NAME");
-    memset(hs_package_name, 0, ICO_HS_MAX_PROCESS_NAME);
-    if (pkg)    {
-        strncpy(hs_package_name, pkg, ICO_HS_MAX_PROCESS_NAME);
+        /* start statusbar apps */
+        sb_app_info = GetAppInfo(sb_package_name);
+        ret = sb_app_info->Execute();
+        if (ret < 0) {
+            ICO_WRN("execute failed(%s) err=%d", sb_package_name, ret);
+        }
     }
     else    {
-        strncpy(hs_package_name, ICO_HS_PROC_DEFAULT_HOMESCREEN,
+        strncpy(os_package_name,
+                config->ConfigGetString(ICO_HS_CONFIG_HOMESCREEN,
+                                        ICO_HS_CONFIG_ONS,
+                                        ICO_HS_APPID_DEFAULT_ONS),
                 ICO_HS_MAX_PROCESS_NAME);
-    }
-
-    /* Initialize WindowController */
-    CicoHSWindowController::Initialize();
-    ICO_DBG("CicoHomeScreen::Initialize: window controller initialized");
-
-    ICO_DBG("CicoHomeScreen::Initialize: start connect to systemcontroller");
-    ico_syc_connect(EventCallBack,NULL);
-    ICO_DBG("CicoHomeScreen::Initialize: end connect to systemcontroller");
-
-    /*initialize system controller*/
-    /*my info*/
-    ICO_DBG("CicoHomeScreen::Initialize: get package name %s",hs_package_name);
-    hs_app_info = GetAppInfo(hs_package_name);
-
-    /*start home statusbar and onscreen*/
-    StartRelations();
-    ICO_DBG("CicoHomeScreen::Initialize: start relation apps");
-
-    /* Get screen size */
-    CicoHSWindowController::GetFullScreenSize(orientation,
-                                              &full_width,&full_height);
-
-    ICO_DBG("full screen size x=%d y=%d",full_width,full_height);
-
-    /* MenuScreen Window Size */
-    menu_width = full_width;
-    menu_height = full_height - ICO_HS_STATUSBAR_WINDOW_HEIGHT -
-                  ICO_HS_CONTROLBAR_WINDOW_HEIGHT;
-
-    /* BackGround Window Size */
-    bg_width = full_width;
-    bg_height = full_height;
-
-    /* Control Bar Window Size */
-    ctl_bar_width = full_width;
-    ctl_bar_height = ICO_HS_CONTROLBAR_WINDOW_HEIGHT;
-
-    // load switch display zone config
-    moveZoneName = config->ConfigGetString("switchzone", "movezone", NULL);
-
-    moveZoneAnimation.name = config->ConfigGetString("switchzone",
-                                                     "animation",
-                                                     ICO_HS_ANIMATION_FADE);
-
-    moveZoneAnimation.time = config->ConfigGetInteger("switchzone",
-                                                      "animatime", 400);
-
-    // debug log
-    ICO_DBG("moveZoneName=%s animation=%s time=%d",
-            moveZoneName, moveZoneAnimation.name, moveZoneAnimation.time);
 
-    ICO_DBG("CicoHomeScreen::Initialize: end");
-
-    return ICO_OK;
+        /* start onscreen apps */
+        os_app_info = GetAppInfo(os_package_name);
+        ret = os_app_info->Execute();
+        if (ret < 0) {
+            ICO_WRN("execute failed(%s) err=%d", os_package_name, ret);
+        }
+    }
+    return;
 }
 
 /*--------------------------------------------------------------------------*/
@@ -1386,20 +1324,79 @@ CicoHomeScreen::Finalize(void)
  * @brief   CicoHomeScreen::CreateMenuWindow
  *          create menu window
  *
- * @param[in]   none
+ * @param[in]   seq     0=create object/1=create menu tiles/2=both
  * @return      none
  */
 /*--------------------------------------------------------------------------*/
 void
-CicoHomeScreen::CreateMenuWindow(void)
+CicoHomeScreen::CreateMenuWindow(int seq)
 {
     /*create window*/
-    ICO_DBG("CicoHomeScreen::CreateMenuWindow: start");
-    menu_window = new CicoHSMenuWindow();
-    menu_window->CreateMenuWindow(ICO_HS_WINDOW_POS_X,ICO_HS_WINDOW_POS_Y,
-                                  menu_width,menu_height);
-    menu_window->ShowWindow();
-    ICO_DBG("CicoHomeScreen::CreateMenuWindow: end");
+    ICO_DBG("CicoHomeScreen::CreateMenuWindow: Enter(%d)", seq);
+    if (seq != 1)   {
+        menu_window = new CicoHSMenuWindow();
+    }
+    if (seq != 0)   {
+        menu_window->CreateMenuWindow(ICO_HS_WINDOW_POS_X,ICO_HS_WINDOW_POS_Y,
+                                      menu_width,menu_height);
+        menu_window->ShowWindow();
+    }
+    ICO_DBG("CicoHomeScreen::CreateMenuWindow: Leave");
+}
+
+/*--------------------------------------------------------------------------*/
+/**
+ * @brief   CicoHomeScreen::MakeMenuWindow
+ *          make menu tile
+ *
+ * @param[in]   data    CicoHomeScreen object
+ * @return  bool
+ * @retval  fixed ECORE_CALLBACK_CANCEL
+ */
+/*--------------------------------------------------------------------------*/
+static Eina_Bool
+MakeMenuWindow(void *data)
+{
+    static int      maked = 0;
+
+    if (maked)  {
+        ICO_DBG("CicoHomeScreen::StartHomeScreen: already maked");
+        return ECORE_CALLBACK_CANCEL;
+    }
+    maked ++;
+    CicoHomeScreen  *homescreen = (CicoHomeScreen *)data;
+
+    ICO_DBG("CicoHomeScreen::MakeMenuWindow Enter");
+
+    /* start onscreen */
+    homescreen->StartRelations(1);
+    ICO_DBG("CicoHomeScreen::StartHomeScreen: start onscreen app");
+
+    /* make menu tiles */
+    homescreen->CreateMenuWindow(1);
+
+    ICO_DBG("CicoHomeScreen::MakeMenuWindow Leave");
+    return ECORE_CALLBACK_CANCEL;
+}
+
+/*--------------------------------------------------------------------------*/
+/**
+ * @brief   CicoHomeScreen::endStartupApp
+ *          make menu tile
+ *
+ * @param[in]   data    CicoHomeScreen object
+ * @param[in]   appid   startup appid
+ * @param[in]   down    app down flag (true=donw/false=running)
+ * @return  none
+ */
+/*--------------------------------------------------------------------------*/
+static void
+endStartupApp(void *data, const char *appid, bool down)
+{
+    if (down)   {
+        CicoHomeScreen  *hs = (CicoHomeScreen *)data;
+        hs->launchNextApps(appid);
+    }
 }
 
 /*--------------------------------------------------------------------------*/
@@ -1435,7 +1432,7 @@ void
 CicoHomeScreen::UpDateMenuWindow(void)
 {
     DeleteMenuWindow();
-    CreateMenuWindow();
+    CreateMenuWindow(2);
 }
 
 /*--------------------------------------------------------------------------*/
@@ -1610,41 +1607,150 @@ CicoHomeScreen::DeleteSwipeInputWindow(void)
 
 /*--------------------------------------------------------------------------*/
 /**
- * @brief   launch applications
+ * @brief   launch timedout
  *
- * @param   filepath  start applications list file path
- * @param   filepathD defalt start applications list file path
+ * @param   data    launch data
  * @return  bool
- * @retval  true  success
- * @retval  false fail
+ * @retval  fixed ECORE_CALLBACK_CANCEL
  */
 /*--------------------------------------------------------------------------*/
-static Eina_Bool launchApps(void* data)
+static Eina_Bool
+launchTimedout(void* data)
 {
-    ICO_DBG("start");
-    launcApps_data_t* x = (launcApps_data_t*) data;
+    launchApps_data_t* x = (launchApps_data_t*) data;
+
     if ((NULL == x) || (NULL == x->hs)) {
-        ICO_DBG("end fail");
+        ICO_DBG("timedout fail");
         return ECORE_CALLBACK_CANCEL;
     }
 
+    if (x->done == false)   {
+        ICO_DBG("timedout start %d(%s)", x->i, x->appid);
+        x->hs->launchNextApps(x->appid);
+    }
+    else    {
+        delete x;
+    }
+    return ECORE_CALLBACK_CANCEL;
+}
+
+/*--------------------------------------------------------------------------*/
+/**
+ * @brief   launch last applications
+ *
+ * @param   appid       startuped appid
+ * @return  number of last apps
+ * @retval  number of last apps
+ */
+/*--------------------------------------------------------------------------*/
+int
+CicoHomeScreen::launchLastApps(void)
+{
+    ICO_DBG("start");
+
     vector<pairAppidSubd> apps;
-    x->hs->readStartupApp(apps);
+    readStartupApp(apps);
+
+    m_launchApps = NULL;
 
     int sz = apps.size();
-    for (int i =sz; i > 0; i--) {
-        string appid = apps[i-1].first;
-        bool bFLAG = apps[i-1].second;
-        const char* app = appid.c_str();
-        ICO_PRF("CHG_APP_STA 1.request app=%s", app);
-        int pid = aul_launch_app(appid.c_str(), NULL);
-        ICO_DBG("            1.request [%d]%d:%s:%d", i, pid, app, (int)bFLAG);
-        if ((0 < pid) && (NULL != x->hs)) {
-            x->hs->startupCheckAdd(pid, appid, bFLAG);
+
+    t_launchApps_data *bx = NULL;
+    t_launchApps_data *x = NULL;
+    for (int i = 0; i < sz; i++) {
+        string appid = apps[i].first;
+        x = new t_launchApps_data;
+        x->next = NULL;
+        if (bx == NULL) {
+            m_launchApps = x;
+        }
+        else    {
+            bx->next = x;
+        }
+        bx = x;
+
+        strncpy(x->appid, appid.c_str(), ICO_HS_MAX_PROCESS_NAME-1);
+        x->appid[ICO_HS_MAX_PROCESS_NAME-1] = 0;
+        x->bFlag = apps[i].second;
+        x->done = false;
+        x->i = i;
+        x->hs = this;
+        x->hist = m_appHis;
+    }
+
+    if (m_launchApps)   {
+        m_appHis->setStartupApp(m_launchApps->appid);
+        m_appHis->setCallbackStartup(endStartupApp, this);
+        launchNextApps(NULL);
+    }
+    else    {
+        m_appHis->setStartupApp(NULL);
+    }
+    ICO_DBG("end success(%d)", sz);
+    return sz;
+}
+
+/*--------------------------------------------------------------------------*/
+/**
+ * @brief   launch next applications
+ *
+ * @param   appid       startuped appid
+ * @return  none
+ */
+/*--------------------------------------------------------------------------*/
+void
+CicoHomeScreen::launchNextApps(const char *appid)
+{
+    ICO_DBG("start");
+
+    t_launchApps_data *x = NULL;
+    t_launchApps_data *bx;
+
+    if (appid != NULL)  {
+        x = m_launchApps;
+        bx = NULL;
+        while (x)   {
+            if (strncmp(x->appid, appid, ICO_HS_MAX_PROCESS_NAME-1) == 0)   break;
+            bx = x;
+            x = x->next;
+        }
+
+        if (x)  {
+            if (bx) {
+                bx->next = x->next;
+            }
+            else    {
+                m_launchApps = x->next;
+            }
+        }
+    }
+
+    if ((x != NULL) || (appid == NULL)) {
+        if (x)  {
+            x->done = true;
+        }
+        if (m_launchApps != NULL)   {
+            ICO_PRF("CHG_APP_STA 1.request app=%s", m_launchApps->appid);
+            int pid = aul_launch_app(m_launchApps->appid, NULL);
+            ICO_DBG("started [%d]%d:%s:%d",
+                    m_launchApps->i, pid, m_launchApps->appid, (int)m_launchApps->bFlag);
+            if (pid > 0)    {
+                startupCheckAdd(pid, m_launchApps->appid, m_launchApps->bFlag);
+                ecore_timer_add(
+                    ((double)((m_launchApps->i < 1) ?
+                        ICO_HS_WAIT_START_LASTAPP : ICO_HS_WAIT_START_LASTAPP2)) / 1000.0,
+                    launchTimedout, m_launchApps);
+            }
+            else    {
+                ICO_WRN("aul_launch_app(%s) Error", m_launchApps->appid);
+                launchTimedout(m_launchApps);
+            }
+        }
+        else if (x != NULL) {
+            (void) MakeMenuWindow(x->hs);
         }
     }
     ICO_DBG("end success");
-    return ECORE_CALLBACK_CANCEL;
 }
 
 /*--------------------------------------------------------------------------*/
@@ -1666,6 +1772,10 @@ CicoHomeScreen::StartHomeScreen(int orientation)
     /*save instance pointer */
     hs_instance = this;
 
+    ICO_DBG("CicoHomeScreen::StartHomeScreen: start connect to systemcontroller");
+    ico_syc_connect(EventCallBack, NULL);
+    ico_syc_service();
+
     /*config copy*/
     this->config = new CicoGKeyFileConfig();
     this->config->Initialize(ICO_HOMESCREEN_CONFIG_FILE, ICO_SYC_PACKAGE_HOMESCREEN);
@@ -1677,10 +1787,7 @@ CicoHomeScreen::StartHomeScreen(int orientation)
     CreateAppInfoList();
 
     /* get pkg name (home screen,status bar,on screen)*/
-    char *pkg;
-    ICO_DBG("CicoHomeSceen::StartHomeScreen: %s: %s",
-            getenv("HOME"), getenv("PKG_NAME"));
-    pkg = getenv("PKG_NAME");
+    char *pkg = getenv("PKG_NAME");
     memset(hs_package_name, 0, ICO_HS_MAX_PROCESS_NAME);
     if (pkg)    {
         strncpy(hs_package_name, pkg, ICO_HS_MAX_PROCESS_NAME);
@@ -1689,6 +1796,7 @@ CicoHomeScreen::StartHomeScreen(int orientation)
         strncpy(hs_package_name, ICO_HS_PROC_DEFAULT_HOMESCREEN,
                 ICO_HS_MAX_PROCESS_NAME);
     }
+    ICO_DBG("CicoHomeSceen::StartHomeScreen: %s: %s", getenv("HOME"), hs_package_name);
 
     /* create application control instance */
     CicoHSAppControl *m_appctrl = CicoHSAppControl::getInstance();
@@ -1702,24 +1810,27 @@ CicoHomeScreen::StartHomeScreen(int orientation)
     CicoHSWindowController::Initialize();
     ICO_DBG("CicoHomeScreen::StartHomeScreen: window controller initialized");
 
-    ICO_DBG("CicoHomeScreen::StartHomeScreen: start connect to systemcontroller");
-    ico_syc_connect(EventCallBack,NULL);
     for (retry = 0; retry < (2000/10); retry++) {
-        ico_syc_service();
         if (ico_syc_isconnect())    break;
+        ico_syc_service();
         usleep(10*1000);
     }
     ICO_DBG("CicoHomeScreen::StartHomeScreen: end connect to systemcontroller");
 
+    // AUL Listen Signal set(launch/dead)
+    initAulListenXSignal();
+
+    // application history class init. before call launchApps
+    InitializeAppHistory();
+
+    /* last application history launch */
+    int numapps = launchLastApps();
+
     /*initialize system controller*/
     /*my info*/
     ICO_DBG("CicoHomeScreen::StartHomeScreen: get package name %s",hs_package_name);
     hs_app_info = GetAppInfo(hs_package_name);
 
-    /*start home statusbar and onscreen*/
-    StartRelations();
-    ICO_DBG("CicoHomeScreen::StartHomeScreen: start relation apps");
-
     /* Get screen size */
     CicoHSWindowController::GetFullScreenSize(orientation,
                                               &full_width,&full_height);
@@ -1747,40 +1858,38 @@ CicoHomeScreen::StartHomeScreen(int orientation)
                                                      ICO_HS_ANIMATION_FADE);
     moveZoneAnimation.time = config->ConfigGetInteger("switchzone",
                                                       "animatime", 400);
-    // debug log
     ICO_DBG("moveZoneName=%s animation=%s time=%d",
             moveZoneName, moveZoneAnimation.name, moveZoneAnimation.time);
 
-    // AUL Listen Signal set(launch/dead)
-    initAulListenXSignal();
-
-    // application history class init. before call launchApps
-    InitializeAppHistory();
-
-    /* application history launch */
-    t_launcApps_data* x = new t_launcApps_data;
-    CicoHSCmdOpts* cmdOpts = CicoHSCmdOpts::getInstance();
-    x->filePath  = cmdOpts->getHistoryFilePath();
-    x->filePathD = cmdOpts->getDefaultHistoryFilePath();
-    x->hs        = this;
-    ecore_timer_add(0.01, launchApps, x);
+    /* start statusbar */
+    StartRelations(0);
+    ICO_DBG("CicoHomeScreen::StartHomeScreen: start statusbar app");
 
     /* Create BackGround window */
     CreateBackWindow();
 
+    /* Create ControlBar window */
+    CreateControlBarWindow();
+
+    /* Show Home Screen */
+    ShowHomeScreenLayer();
+
+    ICO_DBG("CicoHomeScreen::StartHomeScreen: show homescreen");
+
     /* Create SwipeInput window */
     CicoHSSwipeTouch::Initialize(hs_instance->ctl_bar_window, hs_instance->m_appHis,
                                  full_width, full_height);
     CreateSwipeInputWindow();
 
-    /* Create ControlBar window */
-    CreateControlBarWindow();
-
     /* Create Menu window       */
-    CreateMenuWindow();
+    CreateMenuWindow(0);
 
-    /*Show Home Screen*/
-    ShowHomeScreenLayer();
+    ICO_PRF("Completion of Menu of HomeScreen");
+
+    /* wait and start make menu tiles   */
+    ecore_timer_add(((double)((numapps > 1) ? ICO_HS_WAIT_START_MAKEMENU :
+                                              ICO_HS_WAIT_START_MAKENOAPP)) / 1000.0,
+                    MakeMenuWindow, this);
 
     ICO_TRA("CicoHomeScreen::StartHomeScreen Leave");
     return 0;
@@ -2143,10 +2252,12 @@ void CicoHomeScreen::startupCheck(const char* appid)
 
 void CicoHomeScreen::finishStartup(void)
 {
-    ICO_TRA("CicoHomeScreen::finishStartup Enter");
-
     string last = m_appHis->getLastStartupAppid();
     const string& subDisp = m_appHis->getSubDispAppid();
+    const char *lastapp = m_appHis->getStartupApp();
+
+    ICO_TRA("CicoHomeScreen::finishStartup Enter(%s, starup=%s)",
+            last.c_str(), lastapp ? lastapp : "(none)");
 
     list<string> h = m_appHis->getAppHistory();
     // last appid is empty then get new last appid
@@ -2172,8 +2283,16 @@ void CicoHomeScreen::finishStartup(void)
             const char* appid = ai->GetAppId();
             int surface = ai->GetLastSurface();
             if ((0 != last.compare(appid)) && (0 != subDisp.compare(appid))) {
-                ico_syc_show(appid, surface, NULL);
-                ico_syc_hide(appid, surface, NULL);
+                if ((lastapp == NULL) ||
+                    (strncmp(lastapp, appid, ICO_HS_MAX_PROCESS_NAME) == 0))    {
+                    ICO_DBG("show %08x %s(startup last)", surface, appid);
+                    ico_syc_show(appid, surface, NULL);
+                }
+                if ((lastapp != NULL) &&
+                    (strncmp(lastapp, appid, ICO_HS_MAX_PROCESS_NAME) != 0))    {
+                    ICO_DBG("hide %08x %s(startup not last)", surface, appid);
+                    ico_syc_hide(appid, surface, NULL);
+                }
             }
         }
         ++rit_h;
@@ -2188,12 +2307,22 @@ void CicoHomeScreen::finishStartup(void)
     if (ai != NULL) {
         const char* appid = ai->GetAppId();
         int surface = ai->GetLastSurface();
-        ico_syc_show(appid, surface, NULL);
-        ico_syc_change_active(appid, surface);
-        hs_instance->SetActiveAppInfo(appid);
+        if ((lastapp == NULL) ||
+            (strncmp(lastapp, appid, ICO_HS_MAX_PROCESS_NAME) == 0))    {
+            ICO_DBG("show %08x %s(last or not startup)", surface, appid);
+            ico_syc_show(appid, surface, NULL);
+            ico_syc_change_active(appid, surface);
+            hs_instance->SetActiveAppInfo(appid);
+        }
     }
 
     m_appHis->stopStartupCheck();
+    if (m_launchApps == NULL)   {
+        ICO_DBG("CicoHomeScreen::finishStartup reset startup sequence");
+        m_appHis->setStartupApp(NULL);
+        m_appHis->setCallbackStartup(NULL, this);
+    }
+
     ICO_TRA("CicoHomeScreen::finishStartup Leave");
 }
 
@@ -2236,6 +2365,7 @@ void CicoHomeScreen::requestHideAppid(const std::string& app)
         return;
     }
     int surface = ai->GetLastSurface();
+    ICO_DBG("hide %08x %s(hide app)", surface, appid);
     ico_syc_hide(appid, surface, NULL);
     ICO_TRA("end");
 }
@@ -2258,6 +2388,7 @@ void CicoHomeScreen::requestShowAppid(const std::string& app)
         return;
     }
     int surface = ai->GetLastSurface();
+    ICO_DBG("show %08x %s(show app)", surface, appid);
     ico_syc_show(appid, surface, NULL);
     ICO_TRA("end");
 }
@@ -2281,6 +2412,7 @@ void CicoHomeScreen::requestActivationAppid(const std::string& app)
     }
     int surface = ai->GetLastSurface();
     hs_instance->SetActiveAppInfo(app.c_str());
+    ICO_DBG("show %08x %s(active app)", surface, appid);
     ico_syc_show(appid, surface, NULL);
     ico_syc_change_active(appid, surface);
     ICO_TRA("CicoHomeScreen::requestActivationAppid Leave");
@@ -2390,12 +2522,11 @@ CicoHomeScreen::ShowApp_i(const std::string& app)
     animation.name = ICO_HS_MENU_HIDE_ANIMATION_FADE;
     animation.time = ICO_HS_MENU_ANIMATION_DURATION;
 
+    ICO_DBG("show %08x %s(show app)", appinfo->GetLastSurface(), appinfo->GetAppId());
     ico_syc_show(appinfo->GetAppId(), appinfo->GetLastSurface(), &animation);
     ico_syc_change_active(appinfo->GetAppId(), appinfo->GetLastSurface());
     hs_instance->SetActiveAppInfo(appinfo->GetAppId());
-    //raise
-//    RaiseApplicationWindow(appinfo->GetAppId(),
-//                           appinfo->GetLastSurface());
+
     ICO_DBG("raise app %s", app.c_str());
     m_appHis->moveHistoryHead(app);
 }
@@ -2438,6 +2569,7 @@ CicoHomeScreen::HideApp(const std::string& app)
     animation.time = ICO_HS_MENU_ANIMATION_DURATION;
 
     int surface = ai->GetLastSurface();
+    ICO_DBG("hide %08x %s(hide app)", surface, appid);
     ico_syc_hide(appid, surface, &animation);
     ICO_TRA("end");
 }
index b10ab7d..4406337 100644 (file)
 
 #define ICO_HS_CHANGE_ZONE_MAX  10
 
+/*startup wait time(ms)*/
+#define ICO_HS_WAIT_START_LASTAPP   2000    /* last app start timedout time(1st to 2nd) */
+#define ICO_HS_WAIT_START_LASTAPP2   500    /* last app start timedout time(after 2nd)  */
+#define ICO_HS_WAIT_START_MAKEMENU  4000    /* max waiting time until making the menu   */
+#define ICO_HS_WAIT_START_MAKENOAPP 1000    /* making the menu waiting time if no app   */
+
 class CicoHomeScreen
 {
   public:
     CicoHomeScreen(void);
     ~CicoHomeScreen(void);
     static CicoHomeScreen* getInstance(void);
-    int Initialize(int orientation,CicoGKeyFileConfig *config);
     void InitializeAppHistory(void);
     void Finalize(void);
-    int StartRelations();
-    void CreateMenuWindow(void);
+    void StartRelations(int seq);
+    void CreateMenuWindow(int seq);
     void DeleteMenuWindow(void);
     void UpDateMenuWindow(void);
     void CreateBackWindow(void);
@@ -137,6 +142,9 @@ class CicoHomeScreen
     static void ShowApp(const std::string& app);
     static void HideApp(const std::string& app);
     static void MoveApp(const std::string& app, const std::string& zone);
+    int launchLastApps(void);
+    void launchNextApps(const char *appid);
+
   private:
     int GetProcessWindow(const char *appid);
     static void EventCallBack(ico_syc_ev_e event,const void* detail,void* user_data);
@@ -196,7 +204,6 @@ class CicoHomeScreen
     // move zone animation information
     ico_syc_animation_t moveZoneAnimation;
 
-
   protected:
     CicoHomeScreen operator=(const CicoHomeScreen&);
     CicoHomeScreen(const CicoHomeScreen&);