From d3eb924dde663e971656d277cd3ac596372bbc70 Mon Sep 17 00:00:00 2001 From: zheng_wenlong Date: Fri, 30 Nov 2018 15:04:14 +0900 Subject: Add 2 APIs * getAreaList * changeAreaSize --- deploy.sh | 8 +-- policy_manager/config/roles.json.zipc.split | 5 +- policy_manager/policy_manager.cpp | 16 +++++ src/main.cpp | 67 +++++++++++++++++++ src/request.hpp | 1 + src/util.cpp | 16 +++++ src/util.hpp | 11 ++++ src/window_manager.cpp | 99 ++++++++++++++++++++++++++++- src/window_manager.hpp | 3 +- src/wm_layer.cpp | 12 ++++ src/wm_layer.hpp | 1 + src/wm_layer_control.cpp | 43 +++++++++++++ src/wm_layer_control.hpp | 4 ++ 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 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 #include #include +#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 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 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 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 #include #include +#include #include #include @@ -122,4 +123,14 @@ class rectangle long _bottom; }; +typedef struct ChangeAreaReq { + std::string appname; + std::unordered_map area_req; + bool save; + std::unordered_map 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 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 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 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 &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 api_get_display_info(); result api_get_area_info(char const *role); result 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 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& getAreaList() {return this->area2size;} + WMError updateAreaList(const ChangeAreaReq& req); + WMError getUpdateAreaList(ChangeAreaReq* req); + WMError changeAreaSize(std::shared_ptr client, const std::string& area); void appTerminated(const std::shared_ptr client); // Don't use this function. -- cgit 1.2.3-korg