aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzheng_wenlong <wenlong_zheng@nexty-ele.com>2018-11-30 15:04:14 +0900
committerzheng_wenlong <wenlong_zheng@nexty-ele.com>2018-11-30 15:04:14 +0900
commitd3eb924dde663e971656d277cd3ac596372bbc70 (patch)
tree07f9d99060423e54de68d22c7bcd9962b27299de
parentc1d5b18cd9d3318c5dcc2a071a7250f8ab74745c (diff)
Add 2 APIs
* getAreaList * changeAreaSize
-rwxr-xr-xdeploy.sh8
-rw-r--r--policy_manager/config/roles.json.zipc.split5
-rw-r--r--policy_manager/policy_manager.cpp16
-rw-r--r--src/main.cpp67
-rw-r--r--src/request.hpp1
-rw-r--r--src/util.cpp16
-rw-r--r--src/util.hpp11
-rw-r--r--src/window_manager.cpp99
-rw-r--r--src/window_manager.hpp3
-rw-r--r--src/wm_layer.cpp12
-rw-r--r--src/wm_layer.hpp1
-rw-r--r--src/wm_layer_control.cpp43
-rw-r--r--src/wm_layer_control.hpp4
13 files changed, 278 insertions, 8 deletions
diff --git a/deploy.sh b/deploy.sh
index 173be29..d08f669 100755
--- a/deploy.sh
+++ b/deploy.sh
@@ -1,11 +1,11 @@
#!/bin/bash
cd build
-source /opt/agl-sdk/6.0.0_toyota-special/environment-setup-aarch64-agl-linux
+source /opt/agl-sdk/6.0.0_toyota_special/environment-setup-aarch64-agl-linux
make package
if [ $? -eq 0 ]; then
- scp package/windowmanager-service-2017.wgt root@${1}:~
- ssh root@${1} afm-util remove windowmanager-service-2017@0.1
- ssh root@${1} afm-util install windowmanager-service-2017.wgt
+ scp package/windowmanager-service.wgt root@${1}:~
+ ssh root@${1} afm-util remove windowmanager-service@0.1
+ ssh root@${1} afm-util install windowmanager-service.wgt
ssh root@${1} sync
ssh root@${1} reboot
fi \ No newline at end of file
diff --git a/policy_manager/config/roles.json.zipc.split b/policy_manager/config/roles.json.zipc.split
index e21e961..a341d8a 100644
--- a/policy_manager/config/roles.json.zipc.split
+++ b/policy_manager/config/roles.json.zipc.split
@@ -85,14 +85,14 @@
},
{
"category": "general",
- "role": "launcher | poi | browser | mixer | radio | hvac | debug | phone | fallback",
+ "role": "poi | browser | mixer | radio | hvac | debug | phone | fallback",
"area": "normal.full",
"description": "For split test, video and music are moved to category:splitable",
"layer": "apps",
},
{
"category": "system",
- "role": "settings | dashboard",
+ "role": "launcher | settings | dashboard",
"area": "normal.full",
"layer": "apps",
},
@@ -114,6 +114,7 @@
"role": "restriction",
"area": "restriction.normal | restriction.split.main | restriction.split.sub",
"layer": "restriction",
+ "auto_started_roles": "restriction",
},
{
"category": "pop_up",
diff --git a/policy_manager/policy_manager.cpp b/policy_manager/policy_manager.cpp
index 05f2ccb..6a427a5 100644
--- a/policy_manager/policy_manager.cpp
+++ b/policy_manager/policy_manager.cpp
@@ -1079,6 +1079,22 @@ int PolicyManager::loadRolesConfigFile()
this->category2role[category] = std::string(roles);
this->category2areas[category] = vct_areas;
this->layer2categories[layer].push_back(category);
+
+ // TODO: For run-by-default applications, set history in advance
+ const char *auto_started_roles;
+ auto_started_roles = this->getStringFromJson(json_tmp, "auto_started_roles");
+ if (nullptr != auto_started_roles)
+ {
+ std::vector<std::string> vct_auto_started_roles;
+ vct_auto_started_roles =
+ this->parseString(std::string(auto_started_roles), '|');
+
+ for (auto itr = vct_auto_started_roles.end() - 1;
+ itr >= vct_auto_started_roles.begin(); --itr)
+ {
+ this->pushInvisibleRoleHistory(category, *itr);
+ }
+ }
}
// Check
diff --git a/src/main.cpp b/src/main.cpp
index b62bb58..89976ea 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -20,6 +20,7 @@
#include <json.h>
#include <stdlib.h>
#include <vector>
+#include "util.hpp"
#include "window_manager.hpp"
#include "json_helper.hpp"
@@ -618,6 +619,70 @@ void windowmanager_attach_app(afb_req req) noexcept
}
}
+void windowmanager_get_area_list(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ json_object* ret = g_afb_instance->wmgr.api_get_area_list();
+ afb_req_success(req, ret, nullptr);
+}
+
+void windowmanager_change_area_size(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+
+ char* appid = afb_req_get_application_id(req);
+ if(appid)
+ {
+ ChangeAreaReq change_req;
+ change_req.appname = appid;
+ change_req.save = false;
+ json_object *jreq = afb_req_json(req);
+ json_object *jsave, *jareas;
+ HMI_INFO("json_check, %s", json_object_get_string(jreq));
+ if(json_object_object_get_ex(jreq, "save", &jsave))
+ {
+ change_req.save = json_object_get_boolean(jsave);
+ }
+ if (json_object_object_get_ex(jreq, "areas", &jareas))
+ {
+ int size = json_object_array_length(jareas);
+ for(int i = 0; i < size; i++)
+ {
+ json_object* elem = json_object_array_get_idx(jareas, i);
+ struct rect rect;
+ std::string name = jh::getStringFromJson(elem, "name");
+ json_object* jrect;
+ if(json_object_object_get_ex(elem, "rect", &jrect))
+ {
+ rect.x = jh::getIntFromJson(jrect, "x");
+ rect.y = jh::getIntFromJson(jrect, "y");
+ rect.w = jh::getIntFromJson(jrect, "w");
+ rect.h = jh::getIntFromJson(jrect, "h");
+ }
+ else
+ {
+ HMI_ERROR("bad request @area name :%s", name.c_str());
+ afb_req_fail(req, "failed", "bad request");
+ return;
+ }
+ change_req.area_req[name] = rect;
+ }
+ g_afb_instance->wmgr.api_change_area_size(change_req);
+ afb_req_success(req, nullptr, nullptr);
+ }
+ free(appid);
+ }
+ else
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+}
+
void windowmanager_wm_subscribe(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
@@ -711,6 +776,8 @@ const struct afb_verb_v2 windowmanager_verbs[] = {
{"getAreaInfo", windowmanager_getareainfo_thunk, nullptr, nullptr, AFB_SESSION_NONE},
{"getCarInfo", windowmanager_getcarinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE },
{"setRenderOrder", windowmanager_set_render_order, nullptr, nullptr, AFB_SESSION_NONE},
+ {"changeAreaSize", windowmanager_change_area_size, nullptr, nullptr, AFB_SESSION_NONE},
+ {"getAreaList", windowmanager_get_area_list, nullptr, nullptr, AFB_SESSION_NONE},
{"attachApp", windowmanager_attach_app, nullptr, nullptr, AFB_SESSION_NONE},
{"wm_subscribe", windowmanager_wm_subscribe, nullptr, nullptr, AFB_SESSION_NONE},
{"ping", windowmanager_ping, nullptr, nullptr, AFB_SESSION_NONE},
diff --git a/src/request.hpp b/src/request.hpp
index bb203e3..9827627 100644
--- a/src/request.hpp
+++ b/src/request.hpp
@@ -30,6 +30,7 @@ enum Task
{
TASK_ALLOCATE,
TASK_RELEASE,
+ TASK_CHANGE_AREA,
TASK_PARKING_BRAKE_OFF,
TASK_PARKING_BRAKE_ON,
TASK_ACCEL_PEDAL_OFF,
diff --git a/src/util.cpp b/src/util.cpp
index b22a704..7d000b8 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -170,3 +170,19 @@ std::string deleteSpace(std::string str)
return ret;
}
+void ChangeAreaReq::dump()
+{
+ DUMP("=== change request dump ===");
+ DUMP("request from : %s", this->appname.c_str());
+ DUMP("save : %s", this->save ? "true" : "false");
+ for(const auto& req : this->area_req)
+ {
+ DUMP("area change req : %s", req.first.c_str());
+ DUMP(" x:%d y:%d w:%d h:%d",req.second.x, req.second.y, req.second.w, req.second.h);
+ }
+ for(const auto& req : this->update_app2area)
+ {
+ DUMP("update change app : %s, area:%s", req.first.c_str(), req.second.c_str());
+ }
+ DUMP("======== dump end =========");
+} \ No newline at end of file
diff --git a/src/util.hpp b/src/util.hpp
index 57eaf81..4c3870f 100644
--- a/src/util.hpp
+++ b/src/util.hpp
@@ -21,6 +21,7 @@
#include <thread>
#include <string>
#include <vector>
+#include <unordered_map>
#include <sys/poll.h>
#include <string.h>
@@ -122,4 +123,14 @@ class rectangle
long _bottom;
};
+typedef struct ChangeAreaReq {
+ std::string appname;
+ std::unordered_map<std::string, struct rect> area_req;
+ bool save;
+ std::unordered_map<std::string, std::string> update_app2area;
+ ChangeAreaReq() = default;
+ ~ChangeAreaReq() = default;
+ ChangeAreaReq(const ChangeAreaReq& val) = default;
+ void dump();
+} ChangeAreaReq;
#endif // !WM_UTIL_HPP
diff --git a/src/window_manager.cpp b/src/window_manager.cpp
index cdf57c2..93909f5 100644
--- a/src/window_manager.cpp
+++ b/src/window_manager.cpp
@@ -29,6 +29,7 @@ extern "C"
using std::string;
using std::vector;
+using std::unordered_map;
namespace wm
{
@@ -79,6 +80,9 @@ static const char kPathOldRolesConfigFile[] = "/etc/old_roles.json";
static sd_event_source *g_timer_ev_src = nullptr;
static AppList g_app_list;
static WindowManager *g_context;
+static vector<string> white_list_area_size_change = {
+ "homescreen"
+};
struct AfbClosure {
public:
@@ -866,6 +870,99 @@ string WindowManager::api_client_attach_service_surface
return uuid;
}
+json_object* WindowManager::api_get_area_list()
+{
+ json_object* ret = json_object_new_object();
+ json_object* jarray = json_object_new_array();
+ unordered_map<string, struct rect> area2size = this->lc->getAreaList();
+ for(const auto& area : area2size)
+ {
+ json_object* j = json_object_new_object();
+ json_object_object_add(j, "name", json_object_new_string(area.first.c_str()));
+ json_object* jrect = json_object_new_object();
+ json_object_object_add(jrect, "x", json_object_new_int(area.second.x));
+ json_object_object_add(jrect, "y", json_object_new_int(area.second.y));
+ json_object_object_add(jrect, "w", json_object_new_int(area.second.w));
+ json_object_object_add(jrect, "h", json_object_new_int(area.second.h));
+ json_object_object_add(j, "rect", jrect);
+ json_object_array_add(jarray, j);
+ }
+ json_object_object_add(ret, "areas", jarray);
+ HMI_DEBUG("area_list: %s", json_object_get_string(ret));
+ return ret;
+}
+
+void WindowManager::api_change_area_size(ChangeAreaReq &areas)
+{
+ // Error check
+ areas.dump();
+ auto client = g_app_list.lookUpClient(areas.appname);
+ WMError ret;
+ if(client == nullptr)
+ {
+ HMI_ERROR("Call register your role with setRole or requestSurface");
+ return;
+ }
+ if(std::find(white_list_area_size_change.begin(),
+ white_list_area_size_change.end(), client->role()) == white_list_area_size_change.end())
+ {
+ HMI_ERROR("Application %s which has the role %s is not allowed to change area size", client->appID().c_str(), client->role().c_str());
+ return;
+ }
+
+ // Update
+ ret = this->lc->updateAreaList(areas);
+ if(ret != WMError::SUCCESS)
+ {
+ HMI_ERROR("%d : %s", ret, errorDescription(ret));
+ return;
+ }
+ ret = this->lc->getUpdateAreaList(&areas);
+ areas.dump();
+ if(ret != WMError::SUCCESS)
+ {
+ HMI_ERROR("%d : %s", ret, errorDescription(ret));
+ return;
+ }
+
+ // Create Action
+ unsigned req_num;
+ bool found = false;
+ ret = this->setRequest(client->appID(), client->role(), "-", Task::TASK_CHANGE_AREA, &req_num); // area is null
+ if(ret != WMError::SUCCESS)
+ {
+ HMI_SEQ_ERROR(req_num, "%d : %s", ret, errorDescription(ret));
+ return;
+ }
+ for(const auto &update: areas.update_app2area)
+ {
+ // create action
+ auto client = g_app_list.lookUpClient(update.first);
+ if(client == nullptr)
+ {
+ HMI_SEQ_ERROR(req_num, "%s : %s", update.first.c_str(), errorDescription(ret));
+ g_app_list.removeRequest(req_num);
+ this->processNextRequest();
+ return;
+ }
+ ret = g_app_list.setAction(req_num, client, client->role(), update.second, TaskVisible::VISIBLE);
+ if(ret != WMError::SUCCESS)
+ {
+ HMI_SEQ_ERROR(req_num, "Failed to set request");
+ return;
+ }
+ }
+ HMI_SEQ_INFO(req_num, "Area change request");
+ g_app_list.reqDump();
+
+ // Request change size to applications
+ for(const auto &action : g_app_list.getActions(req_num, &found))
+ {
+ string old_role = this->rolenew2old[action.role];
+ this->emit_syncdraw(old_role, action.area);
+ }
+}
+
result<json_object *> WindowManager::api_get_display_info()
{
Screen screen = this->lc->getScreenInfo();
@@ -1913,7 +2010,7 @@ WMError WindowManager::doEndDraw(unsigned req_num)
string old_role = this->rolenew2old[act.role];
switch(act.visible)
{
- case TaskVisible::VISIBLE :
+ case TaskVisible::VISIBLE :
emit_visible(old_role);
emit_activated(old_role);
break;
diff --git a/src/window_manager.hpp b/src/window_manager.hpp
index 18182b2..4809fcf 100644
--- a/src/window_manager.hpp
+++ b/src/window_manager.hpp
@@ -206,7 +206,6 @@ class WindowManager
explicit WindowManager();
~WindowManager() = default;
-
WindowManager(WindowManager const &) = delete;
WindowManager &operator=(WindowManager const &) = delete;
WindowManager(WindowManager &&) = delete;
@@ -232,6 +231,8 @@ class WindowManager
void api_enddraw_for_remote(char const *appid, char const *drawing_name);
bool api_client_set_render_order(const char *appid, const std::vector<std::string> &render_order);
std::string api_client_attach_service_surface(const char* appid, const char* dest, const char* service_surface);
+ json_object* api_get_area_list();
+ void api_change_area_size(ChangeAreaReq &areas);
result<json_object *> api_get_display_info();
result<json_object *> api_get_area_info(char const *role);
result<json_object *> api_get_car_info(char const *label);
diff --git a/src/wm_layer.cpp b/src/wm_layer.cpp
index 2e30069..4e546d0 100644
--- a/src/wm_layer.cpp
+++ b/src/wm_layer.cpp
@@ -203,6 +203,18 @@ void WMLayer::attachAppToArea(const string& app, const string& area)
this->tmp_state.attachAppToArea(app, area);
}
+string WMLayer::attachedApp(const string& area)
+{
+ string ret;
+ auto list = this->state.getCurrentState();
+ auto app = list.find(area);
+ if(app != list.end())
+ {
+ ret = app->second;
+ }
+ return ret;
+}
+
void WMLayer::appendArea(const string& area)
{
this->area_list.push_back(area);
diff --git a/src/wm_layer.hpp b/src/wm_layer.hpp
index 70826d4..dccd7c7 100644
--- a/src/wm_layer.hpp
+++ b/src/wm_layer.hpp
@@ -72,6 +72,7 @@ class WMLayer
void addLayerToState(unsigned layer);
void removeLayerFromState(unsigned layer);
void attachAppToArea(const std::string& app, const std::string& area);
+ std::string attachedApp(const std::string& area);
void update();
void undo();
diff --git a/src/wm_layer_control.cpp b/src/wm_layer_control.cpp
index 75c35da..866bd62 100644
--- a/src/wm_layer_control.cpp
+++ b/src/wm_layer_control.cpp
@@ -516,6 +516,7 @@ WMError LayerControl::loadAreasConfigFile(const std::string& path, const std::st
area_size.y = jh::getIntFromJson(json_rect, "y");
area_size.w = jh::getIntFromJson(json_rect, "w");
area_size.h = jh::getIntFromJson(json_rect, "h");
+ HMI_INFO("%d, %d, %d, %d, ", area_size.x, area_size.y, area_size.w, area_size.h);
this->area2size[area] = area_size;
}
@@ -619,6 +620,48 @@ WMError LayerControl::visibilityChange(const WMAction& action)
return ret;
}
+WMError LayerControl::updateAreaList(const ChangeAreaReq& req)
+{
+ // error check
+ for(const auto& elem : req.area_req)
+ {
+ if(this->area2size.find(elem.first) == this->area2size.end())
+ {
+ HMI_ERROR("requested area %s is not registered in area list", elem.first.c_str());
+ return WMError::NOT_REGISTERED;
+ }
+ }
+ // update list
+ for(const auto& elem : req.area_req)
+ {
+ this->area2size[elem.first] = elem.second;
+ }
+ if(req.save)
+ {
+ HMI_NOTICE("Not implemented");
+ // TODO
+ }
+ return WMError::SUCCESS;
+}
+
+WMError LayerControl::getUpdateAreaList(ChangeAreaReq *req)
+{
+ for(const auto& wm_layer : this->wm_layers)
+ {
+ // get area name and compare it with elem
+ for(const auto& area : req->area_req)
+ {
+ string app = wm_layer->attachedApp(area.first);
+ if(!app.empty())
+ {
+ HMI_INFO("app %s changes area %s", app.c_str(), area.first.c_str());
+ req->update_app2area[app] = area.first;
+ }
+ }
+ }
+ return WMError::SUCCESS;
+}
+
void LayerControl::appTerminated(const shared_ptr<WMClient> client)
{
for(auto& l : this->wm_layers)
diff --git a/src/wm_layer_control.hpp b/src/wm_layer_control.hpp
index fef71ff..63362df 100644
--- a/src/wm_layer_control.hpp
+++ b/src/wm_layer_control.hpp
@@ -79,6 +79,10 @@ class LayerControl
void undoUpdate();
WMError layoutChange(const WMAction& action);
WMError visibilityChange(const WMAction &action);
+ const std::unordered_map<std::string, struct rect>& getAreaList() {return this->area2size;}
+ WMError updateAreaList(const ChangeAreaReq& req);
+ WMError getUpdateAreaList(ChangeAreaReq* req);
+ WMError changeAreaSize(std::shared_ptr<WMClient> client, const std::string& area);
void appTerminated(const std::shared_ptr<WMClient> client);
// Don't use this function.