From 724716d4fba8550efa549ff0ae60c1afedfa7c1d Mon Sep 17 00:00:00 2001 From: wang_zhiqiang Date: Sat, 25 May 2019 09:40:52 +0800 Subject: [PATCH] add register/update shortcut Change-Id: I0e56c9b696e1b7354c49c9f22536960d69efdcb9 --- src/homescreen.cpp | 68 ++++++++++++++++++++++++++++ src/hs-client.cpp | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++--- src/hs-client.h | 6 ++- src/hs-helper.cpp | 2 + 4 files changed, 197 insertions(+), 8 deletions(-) diff --git a/src/homescreen.cpp b/src/homescreen.cpp index d63d5aa..56c1e7c 100644 --- a/src/homescreen.cpp +++ b/src/homescreen.cpp @@ -634,6 +634,72 @@ static void getRunnables(afb_req_t request) afb_req_success_f(request, res, "homescreen binder unsubscribe success."); } +/** + * registerShortcut event + * + * #### Parameters + * - value : the json contents to MenuBar. + * {"application_id":"homescreen","parameter":{"shortcut_id":"dashboard@0.1","shortcut_name":"Dashboard","postion": 1}} + * + * #### Return + * None + * + */ +static void registerShortcut(afb_req_t request) +{ + int ret = 0; + const char* value = afb_req_value(request, _application_id); + if (value) { + ret = g_hs_instance->client_manager->handleRequest(request, __FUNCTION__, value); + } + else { + ret = AFB_EVENT_BAD_REQUEST; + } + + if (ret) { + afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__); + } + else { + struct json_object *res = json_object_new_object(); + hs_add_object_to_json_object_func(res, __FUNCTION__, 2, + _error, ret); + afb_req_success(request, res, "afb_event_push event [registerShortcut]"); + } +} + +/** + * updateShortcut event + * + * #### Parameters + * - value : homescreen shortcut json contents. + * {"application_id":"launcher","parameter":{"shortcut":[{"shortcut_id":"hvac","shortcut_name":"HVAC"},...]}} + * + * #### Return + * None + * + */ +static void updateShortcut(afb_req_t request) +{ + int ret = 0; + const char* value = afb_req_value(request, _application_id); + if (value) { + ret = g_hs_instance->client_manager->handleRequest(request, __FUNCTION__, value); + } + else { + ret = AFB_EVENT_BAD_REQUEST; + } + + if (ret) { + afb_req_fail_f(request, "failed", "called %s, Unknown parameter", __FUNCTION__); + } + else { + struct json_object *res = json_object_new_object(); + hs_add_object_to_json_object_func(res, __FUNCTION__, 2, + _error, ret); + afb_req_success(request, res, "afb_event_push event [updateShortcut]"); + } +} + /* * array of the verbs exported to afb-daemon */ @@ -650,7 +716,9 @@ static const afb_verb_t verbs[]= { { .verb="unsubscribe", .callback=unsubscribe }, { .verb="showNotification", .callback=showNotification }, { .verb="showInformation", .callback=showInformation }, + { .verb="registerShortcut", .callback=registerShortcut }, { .verb="getRunnables", .callback=getRunnables }, + { .verb="updateShortcut", .callback=updateShortcut }, {NULL } /* marker for end of the array */ }; diff --git a/src/hs-client.cpp b/src/hs-client.cpp index d6e771c..e8f0f7b 100644 --- a/src/hs-client.cpp +++ b/src/hs-client.cpp @@ -26,6 +26,9 @@ static const char _icon[] = "icon"; static const char _parameter[] = "parameter"; static const char _replyto[] = "replyto"; static const char _caller[] = "caller"; +static const char _shortcut[] = "shortcut"; +static const char _shortcut_id[] = "shortcut_id"; +static const char _shortcut_name[] = "shortcut_name"; // homescreen-service event and event handler function list const std::unordered_map HS_Client::func_list { @@ -39,9 +42,12 @@ const std::unordered_map HS_Client::func_l {"unsubscribe", &HS_Client::unsubscribe}, {"showNotification", &HS_Client::showNotification}, {"showInformation", &HS_Client::showInformation}, - {"application-list-changed", nullptr} + {"registerShortcut", &HS_Client::registerShortcut}, + {"updateShortcut", &HS_Client::updateShortcut} }; +std::list> HS_Client::shortcut_list; + /** * HS_Client construction function * @@ -183,6 +189,9 @@ int HS_Client::subscribe(afb_req_t request) subscription = true; } } + if (!strcasecmp("updateShortcut", value)) { + pushUpdateShortcutEvent(); + } } } else { @@ -405,6 +414,88 @@ int HS_Client::showInformation(afb_req_t request) return ret; } +/** + * registerShortcut event + * + * #### Parameters + * - request : the request + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::registerShortcut(afb_req_t request) +{ + int ret = 0; + struct json_object *param_obj; + if(json_object_object_get_ex(afb_req_json(request), _parameter, ¶m_obj)) { + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str( push_obj, 4, _application_id, my_id.c_str(), _type, __FUNCTION__); + json_object_object_add(push_obj, _parameter, param_obj); + afb_event_push(my_event, push_obj); + } + else { + AFB_WARNING("please input parameter."); + ret = AFB_EVENT_BAD_REQUEST; + } + return ret; +} + +/** + * updateShortcut event + * + * #### Parameters + * - request : the request + * + * #### Return + * 0 : success + * others : fail + * + */ +int HS_Client::updateShortcut(afb_req_t request) +{ + AFB_INFO("%s application_id = %s.", __FUNCTION__, my_id.c_str()); + int ret = 0; + std::list> new_shortcut_list; + struct json_object *req_json = afb_req_json(request); + struct json_object *param_obj, *shortcut_obj; + if(json_object_object_get_ex(afb_req_json(request), _parameter, ¶m_obj) + && json_object_object_get_ex(param_obj, _shortcut, &shortcut_obj)) { + if(json_object_get_type(shortcut_obj) == json_type_array ) { + int array_len = json_object_array_length(shortcut_obj); + for (int i = 0; i < array_len; ++i) { + struct json_object *obj = json_object_array_get_idx(shortcut_obj, i); + struct json_object *appid_obj, *appname_obj; + if(json_object_object_get_ex(obj, _shortcut_id, &appid_obj) + && json_object_object_get_ex(obj, _shortcut_name, &appname_obj)) { + new_shortcut_list.push_back(std::pair(json_object_get_string(appid_obj), + json_object_get_string(appname_obj))); + } + else { + AFB_WARNING("shortcut list json object pattern error."); + ret = AFB_EVENT_BAD_REQUEST; + break; + } + } + } + else { + AFB_WARNING("json object pattern error."); + ret = AFB_EVENT_BAD_REQUEST; + } + } + else { + AFB_WARNING("input json object error."); + ret = AFB_EVENT_BAD_REQUEST; + } + + if(ret == 0) { + HS_Client::shortcut_list.swap(new_shortcut_list); + pushUpdateShortcutEvent(); + } + return ret; +} + /** * check if client subscribe event * @@ -438,11 +529,8 @@ bool HS_Client::checkEvent(const char* event) */ bool HS_Client::isSupportEvent(const char* event) { - auto ip = func_list.find(std::string(event)); - if(ip == func_list.end()) - return false; - else - return true; + int ret = hs_search_event_name_index(event); + return ret == -1 ? false : true; } /** @@ -496,4 +584,31 @@ int HS_Client::pushEvent(const char *event, struct json_object *param) json_object_object_add(push_obj, _parameter, param); afb_event_push(my_event, push_obj); return 0; -} \ No newline at end of file +} + +/** + * push updateShortcut event + * + * #### Parameters + * None + * + * #### Return + * Nothing + * + */ +void HS_Client::pushUpdateShortcutEvent(void) +{ + struct json_object* arr_obj = json_object_new_array(); + for(auto &it : HS_Client::shortcut_list) { + struct json_object* obj = json_object_new_object(); + json_object_object_add(obj, _shortcut_id, json_object_new_string(it.first.c_str())); + json_object_object_add(obj, _shortcut_name, json_object_new_string(it.second.c_str())); + json_object_array_add(arr_obj, obj); + } + struct json_object* shortcut_obj = json_object_new_object(); + json_object_object_add(shortcut_obj, _shortcut, arr_obj); + struct json_object* push_obj = json_object_new_object(); + hs_add_object_to_json_object_str(push_obj, 4, _application_id, my_id.c_str(), _type, "updateShortcut"); + json_object_object_add(push_obj, _parameter, shortcut_obj); + afb_event_push(my_event, push_obj); +} \ No newline at end of file diff --git a/src/hs-client.h b/src/hs-client.h index cbf2f33..985ecf1 100644 --- a/src/hs-client.h +++ b/src/hs-client.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "hs-helper.h" @@ -45,18 +46,21 @@ private: int unsubscribe(afb_req_t request); int showNotification(afb_req_t request); int showInformation(afb_req_t request); + int registerShortcut(afb_req_t request); + int updateShortcut(afb_req_t request); typedef int (HS_Client::*func_handler)(afb_req_t); static const std::unordered_map func_list; bool checkEvent(const char* event); bool isSupportEvent(const char* event); + void pushUpdateShortcutEvent(void); private: std::string my_id; afb_event_t my_event; bool subscription = false; std::unordered_set event_list; - + static std::list> shortcut_list; }; #endif // HOMESCREEN_CLIENT_H \ No newline at end of file diff --git a/src/hs-helper.cpp b/src/hs-helper.cpp index ef7e687..780b7d4 100644 --- a/src/hs-helper.cpp +++ b/src/hs-helper.cpp @@ -30,6 +30,8 @@ const char* evlist[] = { "showNotification", "showInformation", "application-list-changed", + "registerShortcut", + "updateShortcut", "reserved" }; -- 2.16.6