},
{
"appid": "launcher",
- "visibility": "invisible"
+ "visibility": "invisible",
+ "after": "homescreen"
},
{
"appid": "onscreenapp",
"default-lastmode": [
{
"appid": "launcher",
- "visibility": "visible"
+ "visibility": "visible",
+ "after": "homescreen"
}
],
"normal-apps": [
[
{
- "appid": "navigation",
- "visibility": "visible"
- },
- {
- "appid": "video",
- "visibility": "visible"
+ "appid": "phone",
+ "visibility": "visible",
+ "after": "homescreen"
}
]
\ No newline at end of file
return -1;
}
- const struct handshake_info *h = hs_config.getHandshakeInfo();
- struct hs_handshake handshake(h->times, h->sleep);
- if(handshake.start(api) < 0) {
- AFB_ERROR("handshake with windowmanager failed.");
- return -1;
- }
+ // const struct handshake_info *h = hs_config.getHandshakeInfo();
+ // struct hs_handshake handshake(h->times, h->sleep);
+ // if(handshake.start(api) < 0) {
+ // AFB_ERROR("handshake with windowmanager failed.");
+ // return -1;
+ // }
if(app_recover == nullptr) {
AFB_ERROR("app_recover is nullptr.");
AFB_WARNING( "g_hs_instance isn't null.");
delete g_hs_instance->client_manager;
delete g_hs_instance->app_info;
+ delete g_hs_instance->app_recover;
delete g_hs_instance;
g_hs_instance = nullptr;
}
*/
void HS_AppRecover::startRecovery(afb_api_t api, recover_map &map)
{
- HS_AfmMainProxy afm_proxy;
for(auto &key : HS_Config::keys_recover_type) {
for(auto &m : map[key]){
struct app_recover_info recover_info;
recover_info.recover_type = key;
recover_info.visibility = m.visibility;
+ recover_info.after = m.after;
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
auto it = m_recovering_set.find(m.appid);
if(it == m_recovering_set.end()) {
m_recovering_set.insert(m.appid);
- afm_proxy.start(api, HS_AppInfo::instance()->getAppProperty(m.appid, _keyId));
+ std::string &after = m_recover_apps_list[m.appid].after;
+ if(!after.empty()) {
+ auto w = m_wait_recover_set.find(m_recover_apps_list[m.appid].after);
+ if(w != m_wait_recover_set.end()) {
+ m_wait_recover_set[after].insert(m.appid);
+ }
+ else {
+ std::set<std::string> new_set;
+ new_set.insert(m.appid);
+ m_wait_recover_set[after] = std::move(new_set);
+ }
+ continue; // don't immediately start application, wait until after applicaiton started.
+ }
+ startApplication(api, m.appid);
}
}
}
* true : recover app
*
*/
-bool HS_AppRecover::registerRecoveredApp(const std::string &appid)
+bool HS_AppRecover::registerRecoveredApp(afb_api_t api, const std::string &appid)
{
bool ret = false;
if(m_recovering_set.empty()) {
}
ret = true;
}
+
+ // check wait recover application
+ auto w = m_wait_recover_set.find(appid);
+ if(w != m_wait_recover_set.end()) {
+ for(auto &ref : m_wait_recover_set[appid]) {
+ startApplication(api, ref);
+ }
+ m_wait_recover_set.erase(appid);
+ }
return ret;
}
}
}
+/**
+ * start application
+ *
+ * #### Parameters
+ * - api : the api
+ * - appid : application id liked "dashboard"
+ *
+ * #### Return
+ * None
+ *
+ */
+void HS_AppRecover::startApplication(afb_api_t api, const std::string &appid)
+{
+ HS_AfmMainProxy afm_proxy;
+ afm_proxy.start(api, HS_AppInfo::instance()->getAppProperty(appid, _keyId));
+}
+
/**
* update lastmode file
*
struct app_recover_info {
std::string recover_type;
bool visibility;
+ std::string after;
};
class HS_AppRecover {
static HS_AppRecover* instance(void);
int init(afb_api_t api);
void startRecovery(afb_api_t api, recover_map &map);
- bool registerRecoveredApp(const std::string &appid);
+ bool registerRecoveredApp(afb_api_t api, const std::string &appid);
void screenUpdated(struct json_object *obj);
private:
+ void startApplication(afb_api_t api, const std::string &appid);
void updateLastmode(std::set<std::string> &set);
bool isHomescreenApp(const std::string &appid) const;
static HS_AppRecover* me;
std::map<std::string, struct app_recover_info> m_recover_apps_list;
std::set<std::string> m_recovering_set;
+ std::map<std::string, std::set<std::string>> m_wait_recover_set;
std::set<std::string> m_lastmode_list;
};
}
}
if(isRegisterApp) {
- checkRegisterApp(std::string(appid));
+ checkRegisterApp(request->api, std::string(appid));
}
return ret;
}
* check register application
*
* #### Parameters
+ * - api : the api
* - appid : register application's id
*
* #### Return
* None
*
*/
-void HS_ClientManager::checkRegisterApp(const std::string &appid)
+void HS_ClientManager::checkRegisterApp(afb_api_t api, const std::string &appid)
{
- AFB_INFO("appid=[%s].", appid.c_str());
- if(HS_AppRecover::instance()->registerRecoveredApp(appid)) {
- AFB_NOTICE("register recover application.");
+ if(HS_AppRecover::instance()->registerRecoveredApp(api, appid)) {
+ AFB_INFO("register recover application.");
return;
}
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 checkRegisterApp(const std::string &appid);
+ void checkRegisterApp(afb_api_t api, const std::string &appid);
private:
static HS_ClientManager* me;
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";
+const std::string HS_Config::key_after = "after";
std::string HS_Config::root_dir = "";
/**
else {
info.visibility = false;
}
+ if(json_object_object_get_ex(info_obj, key_after.c_str(), &value_obj)) {
+ info.after = json_object_get_string(value_obj);
+ }
+ else {
+ info.after.clear();
+ }
v_app_info.push_back(info);
}
struct recover_app_info {
std::string appid; // application id like "dashboard"
bool visibility; // the visibility when system starting
+ std::string after; // startup after which application
};
using recover_map = std::unordered_map<std::string, std::vector<struct recover_app_info>>;
static const std::string lastmode_json;
static const std::string key_appid;
static const std::string key_visibility;
+ static const std::string key_after;
static std::string root_dir;
private: