X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fhs-apprecover.cpp;fp=src%2Fhs-apprecover.cpp;h=cedf7510e5b497b80b77fe14e2ab7d09226dce7f;hb=95c8f8ac2526acc5f7467704532ea235532b1876;hp=ded070e4c2fed07ff40513d0553c2c7742903dad;hpb=c393aaa4ae541f1f925981a6f8ae20d46626e8b6;p=apps%2Fagl-service-homescreen.git 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