#include "runxdg.hpp"
#define RUNXDG_CONFIG "runxdg.toml"
+#define AREA_NORMAL_FULL "normal.full"
void fatal(const char* format, ...)
{
va_end(va_args);
}
+static void _activity_reply (int reply, json_object *msg_j) {
+ AGL_DEBUG("REPLY:reply=%d", reply);
+ AGL_DEBUG("REPLY:json %s", json_object_to_json_string(msg_j));
+}
+
void RunXDG::notify_ivi_control_cb (ilmObjectType object, t_ilm_uint id,
t_ilm_bool created)
{
m_launcher->register_surfpid(surf_pid);
if (m_launcher->m_rid &&
surf_pid == m_launcher->find_surfpid_by_rid(m_launcher->m_rid)) {
- setup_surface(id);
+ m_ivi_id = id;
+ setup_surface();
}
m_surfaces[surf_pid] = id;
} else if (object == ILM_LAYER) {
else
AGL_DEBUG("ivi layer: %d destroyed.", id);
}
+
+ //static std::function<int(int)> reply = _reply;
+ AGL_DEBUG("REPLY: %p, %p", _activity_reply, &_activity_reply);
+ int ret;
+ ret = this->m_lc->getActivityStatus("hvac", &_activity_reply);
+ if (!ret) {
+ AGL_DEBUG("Success!! maybe reply late!!!");
+ } else {
+ AGL_DEBUG("Error!! getActivityStatus(hvac)");
+ }
+#if 0
+ {
+ //Test for AGL LifeCycle Management
+ const char* state;
+ int ret;
+ ret = this->m_wm->getActivityStatus("hvac", &state);
+ if (ret == 0) {
+ AGL_DEBUG("Check HVAC state (%s)", state);
+ } else {
+ AGL_DEBUG("Error!! getActivityStatus(hvac)");
+ }
+ ret = this->m_wm->getActivityStatus("dashboard", &state);
+ if (ret == 0) {
+ AGL_DEBUG("Check Dashboard state (%s)", state);
+ } else {
+ AGL_DEBUG("Error!! getActivityStatus(dashboard)");
+ }
+ ret = this->m_wm->getActivityStatus("mediaplayer", &state);
+ if (ret == 0) {
+ AGL_DEBUG("Check MediaPlayer state (%s)", state);
+ } else {
+ AGL_DEBUG("Error!! getActivityStatus(mediaplayer)");
+ }
+ ret = this->m_wm->getActivityStatus("setting", &state);
+ if (ret == 0) {
+ AGL_DEBUG("Check Settting state (%s)", state);
+ } else {
+ AGL_DEBUG("Error!! getActivityStatus(setting)");
+ }
+ }
+#endif
}
void RunXDG::notify_ivi_control_cb_static (ilmObjectType object, t_ilm_uint id,
return -1;
}
- std::function< void(json_object*) > h_active = [](json_object* object) {
+ std::function< void(json_object*) > h_active = [this](json_object* object) {
AGL_DEBUG("Got Event_Active");
+ t_ilm_surface s_ids[1] = { this->m_ivi_id };
+ ilm_setInputFocus(s_ids, 1, ILM_INPUT_DEVICE_KEYBOARD, ILM_TRUE);
};
- std::function< void(json_object*) > h_inactive = [](json_object* object) {
+ std::function< void(json_object*) > h_inactive = [this](json_object* object) {
AGL_DEBUG("Got Event_Inactive");
+ t_ilm_surface s_ids[1] = { this->m_ivi_id };
+ ilm_setInputFocus(s_ids, 1, ILM_INPUT_DEVICE_KEYBOARD, ILM_FALSE);
};
std::function< void(json_object*) > h_visible = [](json_object* object) {
std::function< void(json_object*) > h_syncdraw =
[this](json_object* object) {
AGL_DEBUG("Got Event_SyncDraw");
- json_object* obj = json_object_new_object();
- json_object_object_add(obj, this->m_wm->kKeyDrawingName,
- json_object_new_string(this->m_role.c_str()));
- this->m_wm->endDraw(obj);
+ this->m_wm->endDraw(this->m_role.c_str());
};
std::function< void(json_object*) > h_flushdraw= [](json_object* object) {
m_wm->set_event_handler(LibWindowmanager::Event_SyncDraw, h_syncdraw);
m_wm->set_event_handler(LibWindowmanager::Event_FlushDraw, h_flushdraw);
+ // Test code of lifecycle
+ // Register lifecycle observer for 'HVAC' & 'Dashboard'
+ this->m_lc->registerActivityObserver("hvac");
+ this->m_lc->registerActivityObserver("dashboard");
+
+ std::function< void(json_object*) > h_statusChanged =
+ [this](json_object* object)
+ {
+ json_object* j_state;
+ json_object* j_target;
+ if (!json_object_object_get_ex(object, "state", &j_state) ||
+ !json_object_object_get_ex(object, "target", &j_target)) {
+ AGL_DEBUG("Get Event_StatusChanged but invalid");
+ } else {
+ const char *state = json_object_get_string(j_state);
+ const char *target = json_object_get_string(j_target);
+ AGL_DEBUG("Get Event_StatusChanged(%s, %s)", state, target);
+ }
+ };
+
+ m_lc->set_event_handler(h_statusChanged);
return 0;
}
}
std::function< void(json_object*) > handler = [this] (json_object* object) {
- json_object *val;
-
- if (json_object_object_get_ex(object, "application_name", &val)) {
- const char *name = json_object_get_string(val);
-
- AGL_DEBUG("Event_TapShortcut <%s>", name);
-
- if (strcmp(name, this->m_role.c_str()) == 0) {
- // check app exist and re-launch if needed
- AGL_DEBUG("Activesurface %s ", this->m_role.c_str());
-
- json_object *obj = json_object_new_object();
- json_object_object_add(obj, this->m_wm->kKeyDrawingName,
- json_object_new_string(this->m_role.c_str()));
- json_object_object_add(obj, this->m_wm->kKeyDrawingArea,
- json_object_new_string("normal.full"));
-
- this->m_wm->activateSurface(obj);
- }
- }
+ AGL_DEBUG("Activesurface %s ", this->m_role.c_str());
+ this->m_wm->activateWindow(this->m_role.c_str(), AREA_NORMAL_FULL);
};
m_hs->set_event_handler(LibHomeScreen::Event_TapShortcut, handler);
auto params = app->get_array_of<std::string>("params");
for (const auto& param : *params)
{
+ // replace special string "@port@" and "@token@"
+ size_t found = param.find("@port@");
+ if (found != std::string::npos) {
+ std::string sub1 = param.substr(0, found);
+ std::string sub2 = param.substr(found + 6, param.size() - found);
+ std::string str = sub1 + std::to_string(m_port) + sub2;
+ pl->m_args_v.push_back(str);
+ AGL_DEBUG("params[%s] (match @port@)", str.c_str());
+ continue;
+ }
+
+ found = param.find("@token@");
+ if (found != std::string::npos) {
+ std::string sub1 = param.substr(0, found);
+ std::string sub2 = param.substr(found + 7, param.size() - found);
+ std::string str = sub1 + m_token + sub2;
+ pl->m_args_v.push_back(str);
+ AGL_DEBUG("params[%s] (match @token@)", str.c_str());
+ continue;
+ }
+
pl->m_args_v.push_back(param);
+
AGL_DEBUG("params[%s]", param.c_str());
}
// Setup ilmController API
m_ic = new ILMControl(notify_ivi_control_cb_static, this);
+ m_lc = new LifeCycleObserver;
+
AGL_DEBUG("RunXDG created.");
}
-void RunXDG::setup_surface (int id)
+void RunXDG::setup_surface (void)
{
- std::string sid = std::to_string(id);
+ std::string sid = std::to_string(m_ivi_id);
// This surface is mine, register pair app_name and ivi id.
- json_object *obj = json_object_new_object();
- json_object_object_add(obj, m_wm->kKeyDrawingName,
- json_object_new_string(m_role.c_str()));
- json_object_object_add(obj, m_wm->kKeyIviId,
- json_object_new_string(sid.c_str()));
-
- AGL_DEBUG("requestSurfaceXDG(%s,%s)", m_role.c_str(), sid.c_str());
- m_wm->requestSurfaceXDG(obj);
+ AGL_DEBUG("requestSurfaceXDG(%s,%d)", m_role.c_str(), m_ivi_id);
+ m_wm->requestSurfaceXDG(this->m_role.c_str(), (unsigned int)m_ivi_id);
if (m_pending_create) {
// Recovering 1st time tap_shortcut is dropped because
// the application has not been run yet (1st time launch)
m_pending_create = false;
-
- json_object *obj = json_object_new_object();
- json_object_object_add(obj, m_wm->kKeyDrawingName,
- json_object_new_string(m_role.c_str()));
- json_object_object_add(obj, m_wm->kKeyDrawingArea,
- json_object_new_string("normal.full"));
- m_wm->activateSurface(obj);
+ m_wm->activateWindow(this->m_role.c_str(), AREA_NORMAL_FULL);
}
}
AGL_DEBUG("waiting for notification: surafce created");
m_pending_create = true;
+ ilm_commitChanges();
+
// in case, target app has already run
if (m_launcher->m_rid) {
pid_t surf_pid = m_launcher->find_surfpid_by_rid(m_launcher->m_rid);
int id = itr->second;
AGL_DEBUG("surface %d for <%s> already exists", id,
m_role.c_str());
- setup_surface(id);
+ m_ivi_id = id;
+ setup_surface();
}
}
}
+
+ ilm_commitChanges();
m_launcher->loop(e_flag);
}