diff options
Diffstat (limited to 'src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc')
-rw-r--r-- | src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc | 153 |
1 files changed, 133 insertions, 20 deletions
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc index 622f64f792..881c838c1a 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc @@ -32,6 +32,7 @@ */ #include "sdl_rpc_plugin/commands/mobile/perform_interaction_request.h" + #include <string.h> #include <numeric> #include <string> @@ -46,6 +47,10 @@ #include "utils/gen_hash.h" #include "utils/helpers.h" +namespace { +const std::int32_t INVALID_CHOICE_ID = -1; +} + namespace sdl_rpc_plugin { using namespace application_manager; @@ -67,11 +72,15 @@ PerformInteractionRequest::PerformInteractionRequest( hmi_capabilities, policy_handler) , interaction_mode_(mobile_apis::InteractionMode::INVALID_ENUM) + , ui_choice_id_received_(INVALID_CHOICE_ID) + , vr_choice_id_received_(INVALID_CHOICE_ID) , ui_response_received_(false) , vr_response_received_(false) , app_pi_was_active_before_(false) , vr_result_code_(hmi_apis::Common_Result::INVALID_ENUM) , ui_result_code_(hmi_apis::Common_Result::INVALID_ENUM) { + response_msg_params = + smart_objects::SmartObject(smart_objects::SmartType_Map); subscribe_on_event(hmi_apis::FunctionID::UI_OnResetTimeout); subscribe_on_event(hmi_apis::FunctionID::VR_OnCommand); subscribe_on_event(hmi_apis::FunctionID::Buttons_OnButtonPress); @@ -227,8 +236,6 @@ void PerformInteractionRequest::Run() { void PerformInteractionRequest::on_event(const event_engine::Event& event) { LOG4CXX_AUTO_TRACE(logger_); const smart_objects::SmartObject& message = event.smart_object(); - smart_objects::SmartObject msg_param = - smart_objects::SmartObject(smart_objects::SmartType_Map); switch (event.id()) { case hmi_apis::FunctionID::UI_OnResetTimeout: { @@ -241,22 +248,24 @@ void PerformInteractionRequest::on_event(const event_engine::Event& event) { LOG4CXX_DEBUG(logger_, "Received UI_PerformInteraction event"); EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI); ui_response_received_ = true; + unsubscribe_from_event(hmi_apis::FunctionID::UI_PerformInteraction); ui_result_code_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asUInt()); GetInfo(message, ui_info_); - ProcessUIResponse(event.smart_object(), msg_param); + ProcessUIResponse(event.smart_object(), response_msg_params); break; } case hmi_apis::FunctionID::VR_PerformInteraction: { LOG4CXX_DEBUG(logger_, "Received VR_PerformInteraction"); EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_VR); vr_response_received_ = true; + unsubscribe_from_event(hmi_apis::FunctionID::VR_PerformInteraction); vr_result_code_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asUInt()); GetInfo(message, vr_info_); - if (ProcessVRResponse(event.smart_object(), msg_param)) { + if (ProcessVRResponse(event.smart_object(), response_msg_params)) { return; } break; @@ -268,8 +277,17 @@ void PerformInteractionRequest::on_event(const event_engine::Event& event) { } if (!HasHMIResponsesToWait()) { - LOG4CXX_DEBUG(logger_, "Send response in BOTH iteraction mode"); - SendBothModeResponse(msg_param); + LOG4CXX_DEBUG(logger_, + "Send response in interaction mode " + << static_cast<int32_t>(interaction_mode_)); + if (SetChoiceIdToResponseMsgParams(response_msg_params)) { + SendBothModeResponse(response_msg_params); + } else { + DisablePerformInteraction(); + SendResponse(false, + mobile_apis::Result::GENERIC_ERROR, + "Received two different choice IDs"); + } } } @@ -346,6 +364,11 @@ bool PerformInteractionRequest::ProcessVRResponse( return false; } + if (!ui_response_received_ && + InteractionMode::MANUAL_ONLY != interaction_mode_) { + SendClosePopupRequestToHMI(); + } + const SmartObject& hmi_msg_params = message[strings::msg_params]; if (hmi_msg_params.keyExists(strings::choice_id)) { const int choice_id = hmi_msg_params[strings::choice_id].asInt(); @@ -356,7 +379,7 @@ bool PerformInteractionRequest::ProcessVRResponse( false, Result::GENERIC_ERROR, "Wrong choiceID was received from HMI"); return true; } - msg_params[strings::choice_id] = choice_id; + vr_choice_id_received_ = choice_id; } if (mobile_apis::InteractionMode::BOTH == interaction_mode_ || @@ -397,8 +420,8 @@ void PerformInteractionRequest::ProcessUIResponse( HmiInterfaces::InterfaceState ui_interface_state = application_manager_.hmi_interfaces().GetInterfaceState( HmiInterfaces::HMI_INTERFACE_UI); - bool result = false; - result = Compare<hmi_apis::Common_Result::eType, EQ, ONE>( + + bool result = Compare<hmi_apis::Common_Result::eType, EQ, ONE>( ui_result_code_, hmi_apis::Common_Result::SUCCESS, hmi_apis::Common_Result::WARNINGS); @@ -430,11 +453,14 @@ void PerformInteractionRequest::ProcessUIResponse( // result code must be GENERIC_ERROR in case wrong choice_id if (msg_params.keyExists(strings::choice_id)) { - if (!CheckChoiceIDFromResponse(app, - msg_params[strings::choice_id].asInt())) { + const std::int32_t ui_choice_id = + static_cast<std::int32_t>(msg_params[strings::choice_id].asInt()); + + if (!CheckChoiceIDFromResponse(app, ui_choice_id)) { ui_result_code_ = hmi_apis::Common_Result::GENERIC_ERROR; ui_info_ = "Wrong choiceID was received from HMI"; } else { + ui_choice_id_received_ = ui_choice_id; msg_params[strings::trigger_source] = mobile_apis::TriggerSource::TS_MENU; } @@ -931,15 +957,19 @@ bool PerformInteractionRequest::IsWhiteSpaceExist() { void PerformInteractionRequest::TerminatePerformInteraction() { LOG4CXX_AUTO_TRACE(logger_); + SendClosePopupRequestToHMI(); + DisablePerformInteraction(); +} + +void PerformInteractionRequest::SendClosePopupRequestToHMI() { smart_objects::SmartObject msg_params = smart_objects::SmartObject(smart_objects::SmartType_Map); msg_params[hmi_request::method_name] = "UI.PerformInteraction"; SendHMIRequest(hmi_apis::FunctionID::UI_ClosePopUp, &msg_params); - DisablePerformInteraction(); } bool PerformInteractionRequest::CheckChoiceIDFromResponse( - ApplicationSharedPtr app, int32_t choice_id) { + ApplicationSharedPtr app, const int32_t choice_id) { LOG4CXX_AUTO_TRACE(logger_); const DataAccessor<PerformChoiceSetMap> accessor = app->performinteraction_choice_set_map(); @@ -951,12 +981,14 @@ bool PerformInteractionRequest::CheckChoiceIDFromResponse( const PerformChoice& choice = choice_set_map_it->second; PerformChoice::const_iterator it = choice.begin(); for (; choice.end() != it; ++it) { - const smart_objects::SmartObject& choice_set = - (*it->second).getElement(strings::choice_set); - for (size_t j = 0; j < choice_set.length(); ++j) { - if (choice_id == - choice_set.getElement(j).getElement(strings::choice_id).asInt()) { - return true; + if ((*it->second).keyExists(strings::choice_set)) { + const smart_objects::SmartObject& choice_set = + (*it->second).getElement(strings::choice_set); + for (size_t j = 0; j < choice_set.length(); ++j) { + if (choice_id == + choice_set.getElement(j).getElement(strings::choice_id).asInt()) { + return true; + } } } } @@ -1063,13 +1095,94 @@ void PerformInteractionRequest::SendBothModeResponse( msg_param.empty() ? NULL : &msg_param; std::string info = app_mngr::commands::MergeInfos( ui_perform_info, ui_info_, vr_perform_info, vr_info_); + DisablePerformInteraction(); + SendResponse(result, perform_interaction_result_code, info.empty() ? NULL : info.c_str(), response_params); } -} // namespace commands +mobile_apis::Result::eType +PerformInteractionRequest::PrepareResultCodeForResponse( + const app_mngr::commands::ResponseInfo& ui_response, + const app_mngr::commands::ResponseInfo& vr_response) { + LOG4CXX_DEBUG( + logger_, "InteractionMode = " << static_cast<int32_t>(interaction_mode_)); + + auto mobile_vr_result_code = + MessageHelper::HMIToMobileResult(vr_result_code_); + auto mobile_ui_result_code = + MessageHelper::HMIToMobileResult(ui_result_code_); + + if (mobile_apis::Result::eType::WARNINGS == mobile_vr_result_code) { + if (mobile_apis::Result::eType::SUCCESS == mobile_ui_result_code) { + return mobile_apis::Result::eType::WARNINGS; + } + } else if (mobile_apis::Result::eType::WARNINGS == mobile_ui_result_code) { + if (mobile_apis::Result::eType::SUCCESS == mobile_vr_result_code) { + return mobile_apis::Result::eType::WARNINGS; + } + } + if (mobile_apis::InteractionMode::VR_ONLY == interaction_mode_) { + return mobile_vr_result_code; + } + if (mobile_apis::InteractionMode::MANUAL_ONLY == interaction_mode_) { + return mobile_ui_result_code; + } + + if (INVALID_CHOICE_ID != vr_choice_id_received_) { + return mobile_vr_result_code; + } + if (INVALID_CHOICE_ID != ui_choice_id_received_) { + return mobile_ui_result_code; + } + + return CommandRequestImpl::PrepareResultCodeForResponse(ui_response, + vr_response); +} + +bool PerformInteractionRequest::PrepareResultForMobileResponse( + app_mngr::commands::ResponseInfo& ui_response, + app_mngr::commands::ResponseInfo& vr_response) const { + if (mobile_apis::InteractionMode::VR_ONLY == interaction_mode_) { + return vr_response.is_ok; + } + if (mobile_apis::InteractionMode::MANUAL_ONLY == interaction_mode_) { + return ui_response.is_ok; + } + + return (vr_response.is_ok || ui_response.is_ok); +} + +bool PerformInteractionRequest::SetChoiceIdToResponseMsgParams( + ns_smart_device_link::ns_smart_objects::SmartObject& msg_param) const { + LOG4CXX_AUTO_TRACE(logger_); + + const bool ui_choice_id_valid = INVALID_CHOICE_ID != ui_choice_id_received_; + const bool vr_choice_id_valid = INVALID_CHOICE_ID != vr_choice_id_received_; + + if (ui_choice_id_valid && vr_choice_id_valid && + ui_choice_id_received_ != vr_choice_id_received_) { + return false; + } + + if (mobile_apis::InteractionMode::eType::MANUAL_ONLY == interaction_mode_) { + msg_param[strings::choice_id] = ui_choice_id_received_; + return true; + } + + if (mobile_apis::InteractionMode::eType::VR_ONLY == interaction_mode_) { + msg_param[strings::choice_id] = vr_choice_id_received_; + return true; + } + + msg_param[strings::choice_id] = + ui_choice_id_valid ? ui_choice_id_received_ : vr_choice_id_received_; + return true; +} + +} // namespace commands } // namespace sdl_rpc_plugin |