From 95c8f8ac2526acc5f7467704532ea235532b1876 Mon Sep 17 00:00:00 2001 From: wang_zhiqiang Date: Mon, 22 Apr 2019 17:38:59 +0800 Subject: add lastmode function Change-Id: I4b7ca96d1333d170c211b420d79ea9a4d3e1272a --- src/hs-apprecover.cpp | 111 ++++++++++++++++++++++++++++++++++++++++++++--- src/hs-apprecover.h | 8 +++- src/hs-clientmanager.cpp | 18 +------- src/hs-clientmanager.h | 1 - src/hs-config.cpp | 10 +++-- src/hs-config.h | 7 +-- src/hs-helper.cpp | 4 +- 7 files changed, 128 insertions(+), 31 deletions(-) diff --git a/src/hs-apprecover.cpp b/src/hs-apprecover.cpp index ded070e..cedf751 100644 --- a/src/hs-apprecover.cpp +++ b/src/hs-apprecover.cpp @@ -36,7 +36,7 @@ HS_AppRecover* HS_AppRecover::me = nullptr; */ int on_screen_update_event(afb_api_t api, const char *event, struct json_object *object) { - + HS_AppRecover::instance()->screenUpdated(object); return 0; } @@ -97,6 +97,9 @@ void HS_AppRecover::startRecovery(afb_api_t api, recover_map &map) recover_info.recover_type = key; recover_info.visibility = m.visibility; m_recover_apps_list[m.appid] = std::move(recover_info); + if(key == HS_Config::keys_recover_type[1]) { + m_lastmode_list.insert(m.appid); + } // recover application m_recovering_set.insert(m.appid); @@ -112,11 +115,15 @@ void HS_AppRecover::startRecovery(afb_api_t api, recover_map &map) * - appid : application id liked "dashboard" * * #### Return - * false : not all application recovered - * true : all applications recovered + * None + * */ -bool HS_AppRecover::registerRecoveredApp(std::string &appid) +void HS_AppRecover::registerRecoveredApp(const std::string &appid) { + if(m_recovering_set.empty()) { + return; + } + auto it = m_recovering_set.find(appid); if(it != m_recovering_set.end()) { m_recovering_set.erase(appid); @@ -126,6 +133,100 @@ bool HS_AppRecover::registerRecoveredApp(std::string &appid) HS_ClientManager::instance()->pushEvent("showWindow", nullptr, appid); } } +} + +/** + * screenUpdated event handler + * + * #### Parameters + * - obj : screenUpdate object + * + * #### Return + * None + * + */ +void HS_AppRecover::screenUpdated(struct json_object *obj) +{ + std::set s_mode; + struct json_object *ids_obj; + if(json_object_object_get_ex(obj, key_ids.c_str(), &ids_obj)) { + if(json_object_get_type(ids_obj) == json_type_array) { + int array_len = json_object_array_length(ids_obj); + for (int i = 0; i < array_len; ++i) { + struct json_object *j_id = json_object_array_get_idx(ids_obj, i); + std::string appid = json_object_get_string(j_id); + if(!isHomescreenApp(appid)) { + s_mode.insert(appid); + } + } + if(!s_mode.empty()) { + updateLastmode(s_mode); + } + } + else { + AFB_WARNING("screenUpdated list isn't array."); + } + } +} + +/** + * update lastmode file + * + * #### Parameters + * - set : new lastmode set + * + * #### Return + * None + * + */ +void HS_AppRecover::updateLastmode(std::set &set) +{ + if(set.size() == m_lastmode_list.size()) { + bool is_same = true; + for(auto &m : set) { + auto it = m_lastmode_list.find(m); + if(it == m_lastmode_list.end()) { + is_same = false; + break; + } + } + if(is_same) { // lastmode aren't changed + return; + } + } + + m_lastmode_list.swap(set); + struct json_object *arr_obj = json_object_new_array(); + for(auto &it : m_lastmode_list) { + struct json_object *j_obj = json_object_new_object(); + json_object_object_add(j_obj, HS_Config::key_appid.c_str(), json_object_new_string(it.c_str())); + json_object_object_add(j_obj, HS_Config::key_visibility.c_str(), json_object_new_string("visible")); + json_object_array_add(arr_obj, j_obj); + } + + auto path = HS_Config::root_dir + "/etc/" + HS_Config::lastmode_json; + if(writeJsonFile(path.c_str(), arr_obj) < 0) { + AFB_ERROR("write lastmode error."); + } +} - return m_recovering_set.empty() ? true : false; +/** + * judge whether app is Homescreen app + * + * #### Parameters + * - appid : application id + * + * #### Return + * true : homescreen app + * false : not homescreen app + * + */ +bool HS_AppRecover::isHomescreenApp(const std::string &appid) const +{ + auto it = m_recover_apps_list.find(appid); + if(it != m_recover_apps_list.end() + && it->second.recover_type == HS_Config::keys_recover_type[0]) { + return true; + } + return false; } \ No newline at end of file diff --git a/src/hs-apprecover.h b/src/hs-apprecover.h index abaf20b..3a0f8d5 100644 --- a/src/hs-apprecover.h +++ b/src/hs-apprecover.h @@ -38,12 +38,18 @@ public: static HS_AppRecover* instance(void); int init(afb_api_t api); void startRecovery(afb_api_t api, recover_map &map); - bool registerRecoveredApp(std::string &appid); + void registerRecoveredApp(const std::string &appid); + void screenUpdated(struct json_object *obj); private: + void updateLastmode(std::set &set); + bool isHomescreenApp(const std::string &appid) const; + + const std::string key_ids = "ids"; static HS_AppRecover* me; std::map m_recover_apps_list; std::set m_recovering_set; + std::set m_lastmode_list; }; #endif // HOMESCREEN_APPRECOVER_H \ No newline at end of file diff --git a/src/hs-clientmanager.cpp b/src/hs-clientmanager.cpp index 83d6bb3..1128b01 100644 --- a/src/hs-clientmanager.cpp +++ b/src/hs-clientmanager.cpp @@ -17,6 +17,7 @@ #include #include #include "hs-clientmanager.h" +#include "hs-apprecover.h" static const char _homescreen[] = "homescreen"; @@ -187,7 +188,7 @@ int HS_ClientManager::handleRequest(afb_req_t request, const char *verb, const c appid2ctxt[appid] = createClientCtxt(request, appid); HS_Client* client = addClient(request, appid); ret = client->handleRequest(request, "subscribe"); - registerApplication(appid); + HS_AppRecover::instance()->registerRecoveredApp(std::string(appid)); } else { AFB_NOTICE("not exist session"); @@ -232,19 +233,4 @@ int HS_ClientManager::pushEvent(const char *event, struct json_object *param, st } return 0; -} - -/** - * register recovered application - * - * #### Parameters - * - appid : application id - * - * #### Return - * None - * - */ -void HS_ClientManager::registerApplication(std::string appid) -{ - } \ No newline at end of file diff --git a/src/hs-clientmanager.h b/src/hs-clientmanager.h index cbddaba..efc36de 100644 --- a/src/hs-clientmanager.h +++ b/src/hs-clientmanager.h @@ -53,7 +53,6 @@ private: HS_ClientCtxt* createClientCtxt(afb_req_t req, std::string appid); HS_Client* addClient(afb_req_t req, std::string appid); void removeClient(std::string appid); - void registerApplication(std::string appid); private: static HS_ClientManager* me; diff --git a/src/hs-config.cpp b/src/hs-config.cpp index b8f9f5b..c0d6942 100644 --- a/src/hs-config.cpp +++ b/src/hs-config.cpp @@ -22,6 +22,10 @@ const std::array HS_Config::keys_recover_type = { // based on "default-lastmode", "normal-apps" }; +const std::string HS_Config::lastmode_json = "lastmode.json"; +const std::string HS_Config::key_appid = "appid"; +const std::string HS_Config::key_visibility = "visibility"; +std::string HS_Config::root_dir = ""; /** * read configuration file to memory @@ -35,14 +39,14 @@ const std::array HS_Config::keys_recover_type = { // based on */ int HS_Config::readConfig(void) { - auto rootdir = std::string(getenv("AFM_APP_INSTALL_DIR")); - auto path = rootdir + "/etc/" + hs_conf_json; + root_dir = std::string(getenv("AFM_APP_INSTALL_DIR")); + auto path = root_dir + "/etc/" + hs_conf_json; if(readJsonFile(path.c_str(), &m_hs_conf) < 0) { AFB_ERROR("read %s failed.", hs_conf_json.c_str()); return -1; } - path = rootdir + "/etc/" + lastmode_json; + path = root_dir + "/etc/" + lastmode_json; if(readJsonFile(path.c_str(), &m_lastmode) < 0) { AFB_ERROR("read %s failed.", lastmode_json.c_str()); m_lastmode = nullptr; diff --git a/src/hs-config.h b/src/hs-config.h index d422248..fda49a7 100644 --- a/src/hs-config.h +++ b/src/hs-config.h @@ -48,19 +48,20 @@ public: const struct handshake_info* getHandshakeInfo(void) const {return &m_handshake_info;} recover_map& getRecoverMap(void) {return m_recover_map;} static const std::array keys_recover_type; // based on hs-conf.json + static const std::string lastmode_json; + static const std::string key_appid; + static const std::string key_visibility; + static std::string root_dir; private: int parseConfig(void); std::vector getRecoverAppInfo(struct json_object *obj); const std::string hs_conf_json = "hs-conf.json"; - const std::string lastmode_json = "lastmode.json"; const std::string key_handshake = "handshake"; const std::string key_times = "times"; const std::string key_sleep = "sleep"; const std::string key_recover = "recover"; - const std::string key_appid = "appid"; - const std::string key_visibility = "visibility"; struct json_object *m_hs_conf; struct json_object *m_lastmode; diff --git a/src/hs-helper.cpp b/src/hs-helper.cpp index 33ab721..30b53b2 100644 --- a/src/hs-helper.cpp +++ b/src/hs-helper.cpp @@ -330,8 +330,8 @@ int readJsonFile(const char* file, struct json_object **obj) * - obj : json_object * * #### Return - * 0 : read success - * -1 : read fail + * 0 : write success + * -1 : write fail * */ int writeJsonFile(const char* file, struct json_object *obj) -- cgit 1.2.3-korg