Skip to content

Commit

Permalink
Squashed commit of the following:
Browse files Browse the repository at this point in the history
commit ce9fc44
Author: Andrii Kalinich <AKalinich@luxoft.com>
Date:   Thu Aug 5 18:50:33 2021 -0400

    Update CUSTOM_BUTTON logic

commit 237562b
Author: Andrii Kalinich <AKalinich@luxoft.com>
Date:   Thu Aug 5 09:10:59 2021 -0400

    fixup! Address Livio comments

commit 1614294
Author: Andrii Kalinich <AKalinich@luxoft.com>
Date:   Wed Aug 4 17:17:17 2021 -0400

    Address Livio comments

commit daa1060
Author: Andrii Kalinich <AKalinich@luxoft.com>
Date:   Tue Jul 27 20:15:06 2021 -0400

    Address Livio comments

commit a327f06
Author: Olha Vorobiova <olha.vorobiova@dxc.com>
Date:   Tue Jul 20 16:40:27 2021 +0300

    Add unit tests for subscribe and unsubscribe button

commit dce94e5
Merge: f78f0c8 82703c9
Author: Andrii Kalinich (GitHub) <AKalinich@luxoft.com>
Date:   Fri Jul 16 19:12:45 2021 -0400

    Merge pull request #206 from LuxoftSDL/impl/sdl_0192_fix_resumption_of_button_subscriptions

    Separate subscription processing logic for mobile requests and resumption

commit 82703c9
Author: Andrii Kalinich <AKalinich@luxoft.com>
Date:   Fri Jul 16 15:07:15 2021 -0400

    Return on_event() back to HMI subscription request

commit f78f0c8
Merge: 94c770b e7e1ebf
Author: Andrii Kalinich (GitHub) <AKalinich@luxoft.com>
Date:   Fri Jul 16 19:00:15 2021 -0400

    Merge pull request #205 from LuxoftSDL/fix/sdl_0192_fix_custom_button_subscription_logic

    Fix CUSTOM_BUTTON subscription logic

commit e7e1ebf
Author: Andrii Kalinich <AKalinich@luxoft.com>
Date:   Fri Jul 16 13:02:46 2021 -0400

    Fix affected unit tests

commit d156a9f
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Fri Jul 16 16:09:27 2021 +0300

    Separate subscription processing for mobile requests and resumption

commit 9e461d0
Author: Andrii Kalinich <AKalinich@luxoft.com>
Date:   Fri Jul 16 01:31:05 2021 -0400

    Fix CUSTOM_BUTTON subscription logic

    Was removed subscription to custom button by default.
    Also, added check if app is actually subscribed to
    CUSTOM_BUTTON like for all other buttons.

commit 94c770b
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Wed Jul 14 15:32:40 2021 +0300

    Revert expired button requests if response was received after timeout

commit de6c7aa
Merge: 0343ea4 eaec9b4
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Thu Jul 15 15:23:10 2021 +0300

    Merge branch 'develop' into feature/sdl_0192_button_subscription_response_from_hmi

commit 0343ea4
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Mon Jul 5 14:46:21 2021 +0300

    Add shared base class for mobile button notifications

commit 3d7d670
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Fri Jul 9 16:13:21 2021 +0300

    Unify approach to result codes processing

commit e5dfa88
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Thu Jul 8 11:40:13 2021 +0300

    Remove OnButtonSubscription notification

commit 06dc978
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Wed Jul 7 13:39:12 2021 +0300

    Resume button subscriptions

commit 4cf9954
Author: Vadym Luchko (GitHub) <76956836+VadymLuchko@users.noreply.github.com>
Date:   Fri Jul 9 14:09:43 2021 +0300

    unsubscribe buttons implementation (#197)

commit 1304547
Author: Yana Chernysheva <ychernysheva@luxoft.com>
Date:   Wed Jun 30 17:16:30 2021 +0300

    Add SubscribeButtonRequest and SubscribeButtonResponse classes
  • Loading branch information
iCollin committed Aug 12, 2021
1 parent 2532805 commit 036b185
Show file tree
Hide file tree
Showing 62 changed files with 2,395 additions and 894 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
#include "application_manager/hmi_state.h"
#include "application_manager/message.h"
#include "connection_handler/device.h"
#include "interfaces/HMI_API.h"
#include "interfaces/MOBILE_API.h"
#include "protocol_handler/protocol_handler.h"
#include "smart_objects/smart_object.h"
Expand Down Expand Up @@ -106,6 +107,8 @@ struct AppFile {
mobile_apis::FileType::eType file_type;
};
typedef std::map<std::string, AppFile> AppFilesMap;
typedef std::map<int32_t, hmi_apis::Common_ButtonName::eType>
ButtonSubscriptionsMap;
class InitialApplicationData {
public:
virtual ~InitialApplicationData() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ enum VRTTSSessionChanging { kVRSessionChanging = 0, kTTSSessionChanging };
typedef std::map<protocol_handler::ServiceType, std::set<uint32_t> >
ServiceStreamingStatusMap;

typedef std::map<const int32_t, ExpiredButtonRequestData>
ExpiredButtonRequestsMap;

struct CommandParametersPermissions;
typedef std::map<std::string, hmi_apis::Common_TransportType::eType>
DeviceTypes;
Expand Down Expand Up @@ -1542,6 +1545,16 @@ class ApplicationManagerImpl
static std::vector<std::string> ConvertRejectedParamList(
const std::vector<std::string>& input);

void AddExpiredButtonRequest(
const uint32_t app_id,
const int32_t corr_id,
const hmi_apis::Common_ButtonName::eType button_name) OVERRIDE;

utils::Optional<ExpiredButtonRequestData> GetExpiredButtonRequestData(
const int32_t corr_id) const OVERRIDE;

void DeleteExpiredButtonRequest(const int32_t corr_id) OVERRIDE;

private:
const ApplicationManagerSettings& settings_;
/**
Expand Down Expand Up @@ -1705,6 +1718,9 @@ class ApplicationManagerImpl
ServiceStreamingStatusMap streaming_application_services_;
sync_primitives::Lock streaming_services_lock_;

mutable sync_primitives::Lock expired_button_requests_lock_;
mutable ExpiredButtonRequestsMap expired_button_requests_;

#ifdef BUILD_TESTS
public:
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* Copyright (c) 2021, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of the Ford Motor Company nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_COMMANDS_BUTTON_NOTIFICATION_TO_MOBILE_H_
#define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_COMMANDS_BUTTON_NOTIFICATION_TO_MOBILE_H_

#include "application_manager/application.h"
#include "command_notification_impl.h"
#include "interfaces/MOBILE_API.h"

namespace application_manager {
namespace commands {
namespace app_mngr = application_manager;

/**
* @brief Class is intended to encapsulate shared button notification logic in
* base class. Entities defined in this file do not conform to any version of
* HMI or mobile API, and exist only to remove duplication in OnButtonPress and
* OnButtonEvent notifications.
**/
class ButtonNotificationToMobile
: public app_mngr::commands::CommandNotificationImpl {
public:
/**
* @brief ButtonNotificationToMobile class constructor
**/
ButtonNotificationToMobile(
const app_mngr::commands::MessageSharedPtr& message,
app_mngr::ApplicationManager& application_manager,
app_mngr::rpc_service::RPCService& rpc_service,
app_mngr::HMICapabilities& hmi_capabilities,
policy::PolicyHandlerInterface& policy_handler);

/**
* @brief ButtonNotificationToMobile class destructor
**/
~ButtonNotificationToMobile();

/**
* @brief Execute command
**/
void Run() OVERRIDE;

protected:
virtual void SendButtonNotification(app_mngr::ApplicationSharedPtr app) = 0;

/**
* @brief HandleCustomButton handle event for custom buttons
* @param app pointer to application data.
**/
void HandleCustomButton(app_mngr::ApplicationSharedPtr app);

/**
* @brief HandleOKButton handle event for OK button
* @param app pointer to application data.
**/
void HandleOKButton(app_mngr::ApplicationSharedPtr app);

/**
* @brief HandleMediaButton handle event for media buttons
* @param app pointer to application data.
**/
void HandleMediaButton(app_mngr::ApplicationSharedPtr app);

/**
* @brief DoesParamExist check whether param is exists in msg_params
* @param param_name name of parameter to find
**/
bool DoesParamExist(const std::string& param_name) const;

/**
* @brief SubscribedApps get subscribed apps for btn id received in message
* @return Return applications list subscribed to current button
**/
std::vector<ApplicationSharedPtr> SubscribedApps() const;
};
} // namespace commands
} // namespace application_manager

#endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_COMMANDS_BUTTON_NOTIFICATION_TO_MOBILE_H_
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ struct CommandParametersPermissions {
};

namespace commands {

/**
* @brief Checks Mobile result code for single RPC
* @param result_code contains result code from response to Mobile
* @return true if result code complies to successful result codes,
* false otherwise.
*/
bool IsMobileResultSuccess(const mobile_apis::Result::eType result_code);

/**
* @brief Checks HMI result code for single RPC
* @param result_code contains result code from HMI response
* @return true if result code complies to successful result codes,
* false otherwise.
*/
bool IsHMIResultSuccess(const hmi_apis::Common_Result::eType result_code);

/**
* @brief Class is intended to encapsulate RPC as an object
**/
Expand Down Expand Up @@ -183,6 +200,16 @@ class CommandImpl : public Command {
*/
bool CheckSyntax(const std::string& str, bool allow_empty_line = false) const;

/**
* @brief Checks HMI result code for single RPC
* @param result_code contains result code from HMI response
* @param interface to check availability
* @return true if result code complies to successful result codes,
* false otherwise.
*/
bool IsHMIResultSuccess(hmi_apis::Common_Result::eType result_code,
HmiInterfaces::InterfaceID interface) const;

// members
static const int32_t hmi_protocol_type_;
static const int32_t mobile_protocol_type_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,24 +206,6 @@ class CommandRequestImpl : public CommandImpl,
mobile_apis::Result::eType GetMobileResultCode(
const hmi_apis::Common_Result::eType& hmi_code) const;

/**
* @brief Checks Mobile result code for single RPC
* @param result_code contains result code from response to Mobile
* @return true if result code complies to successful result codes,
* false otherwise.
*/
static bool IsMobileResultSuccess(
const mobile_apis::Result::eType result_code);

/**
* @brief Checks HMI result code for single RPC
* @param result_code contains result code from HMI response
* @return true if result code complies to successful result codes,
* false otherwise.
*/
static bool IsHMIResultSuccess(
const hmi_apis::Common_Result::eType result_code);

protected:
/**
* @brief Checks message permissions and parameters according to policy table
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,6 @@ class RequestFromHMI : public CommandImpl, public event_engine::EventObserver {
const uint32_t hmi_correlation_id,
const hmi_apis::FunctionID::eType& function_id);

protected:
bool IsMobileResultSuccess(mobile_apis::Result::eType result_code) const;

bool IsHMIResultSuccess(hmi_apis::Common_Result::eType result_code,
HmiInterfaces::InterfaceID interface) const;

private:
/**
* @brief Fills common parameters for SO
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,52 +273,46 @@ class MessageHelper {
const std::string& path_to_icon, uint32_t app_id);

/**
* @brief Sends button subscription notification
* @param app_id Application ID
* @param button Enum with button name
* @param is_subscribed true if subscribed, false otherwise
* @brief Creates button subscription requests for buttons
* that application is subscribed on
* @param app application to be subscribed for button
* @param button_subscriptions collection of subscribed buttons
* @param function_id function ID
* @param app_mngr reference to application manager
* @return list of all buttons subscription requests ready to be sent to hmi
* @note for every button separate request is created in the list
*/
static void SendOnButtonSubscriptionNotification(
const uint32_t app_id,
const hmi_apis::Common_ButtonName::eType button,
const bool is_subscribed,
static smart_objects::SmartObjectList
CreateButtonSubscriptionsHandlingRequestsList(
ApplicationConstSharedPtr app,
const ButtonSubscriptions& button_subscriptions,
const hmi_apis::FunctionID::eType function_id,
ApplicationManager& app_mngr);

/**
* @brief Creates button subscription notification
* @param app_id Application ID
* @param button Enum with button name
* @param is_subscribed true if subscribed, false otherwise
* @return notification message in SmartObject format
*/
static smart_objects::SmartObjectSPtr CreateOnButtonSubscriptionNotification(
const uint32_t app_id,
const hmi_apis::Common_ButtonName::eType button,
const bool is_subscribed);

/**
* @brief Sends button subscription notifications for all buttons
* that application is subscribed on
* @brief Creates button subscription request to mobile
* @param app shared pointer to application instance
* @param app_mngr reference to application manager
* @param source_message source message
* @return Smart object with fulfilled request
*/
static void SendAllOnButtonSubscriptionNotificationsForApp(
ApplicationConstSharedPtr app, ApplicationManager& app_mngr);
static smart_objects::SmartObjectSPtr CreateButtonNotificationToMobile(
ApplicationSharedPtr app,
const smart_objects::SmartObject& source_message);

/**
* @brief Creates button subscription notifications for buttons
* that application is subscribed on
* @param app shared pointer to application instance
* @brief Creates button subscription request to hmi
* @param app_id id of application for which request should be created
* @param button_name button to be subscribed
* @param function_id function ID
* @param app_mngr reference to application manager
* @param button_subscriptions collection of subscribed buttons
* @return list of notification messages in SmartObject format
* @return Smart object with fulfilled request
*/
static smart_objects::SmartObjectList
CreateOnButtonSubscriptionNotificationsForApp(
ApplicationConstSharedPtr app,
ApplicationManager& app_mngr,
const ButtonSubscriptions& button_subscriptions);
static smart_objects::SmartObjectSPtr
CreateButtonSubscriptionHandlingRequestToHmi(
const uint32_t app_id,
const hmi_apis::Common_ButtonName::eType button_name,
const hmi_apis::FunctionID::eType function_id,
ApplicationManager& app_mngr);

static void SendAppDataToHMI(ApplicationConstSharedPtr app,
ApplicationManager& app_man);
Expand Down Expand Up @@ -992,18 +986,6 @@ class MessageHelper {
static void SendResetPropertiesRequest(ApplicationSharedPtr application,
ApplicationManager& app_mngr);

/**
* @brief SendUnsubscribeButtonNotification sends notification to HMI to
* remove button subscription for application
* @param button Button type
* @param application Application to unsubscribe
* @param app_mngr Application manager
*/
static void SendUnsubscribeButtonNotification(
mobile_apis::ButtonName::eType button,
ApplicationSharedPtr application,
ApplicationManager& app_mngr);

/**
* @brief Sends HMI status notification to mobile
* @param application application with changed HMI status
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,17 @@ class ResumptionDataProcessorImpl
const smart_objects::SmartObject& request,
const smart_objects::SmartObject& response) const;

/**
* @brief Checks whether SubscribeButton response successful or not and
* subscribes application if successful
* @param app_id application id
* @param request reference to request SO
* @param response reference to response SO
*/
void ProcessSubscribeButtonResponse(
const uint32_t app_id,
const smart_objects::SmartObject& request,
const smart_objects::SmartObject& response);
app_mngr::ApplicationManager& application_manager_;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,8 +240,8 @@ void ASGetAppServiceDataRequestFromHMI::on_event(
hmi_apis::Common_Result::eType result =
static_cast<hmi_apis::Common_Result::eType>(
event_message[strings::params][hmi_response::code].asInt());
bool success =
IsHMIResultSuccess(result, HmiInterfaces::HMI_INTERFACE_AppService);
bool success = CommandImpl::IsHMIResultSuccess(
result, HmiInterfaces::HMI_INTERFACE_AppService);
if (ValidateResponse(msg_params)) {
SendResponse(success,
correlation_id(),
Expand All @@ -263,7 +263,8 @@ void ASGetAppServiceDataRequestFromHMI::on_event(
msg_params[strings::result_code].asInt());
hmi_apis::Common_Result::eType result =
MessageHelper::MobileToHMIResult(mobile_result);
bool success = IsMobileResultSuccess(mobile_result);
bool success =
application_manager::commands::IsMobileResultSuccess(mobile_result);

if (ValidateResponse(msg_params)) {
SendResponse(success,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ void ASPerformAppServiceInteractionRequestFromHMI::on_event(
msg_params[strings::result_code].asInt());
hmi_apis::Common_Result::eType result =
MessageHelper::MobileToHMIResult(mobile_result);
bool success = IsMobileResultSuccess(mobile_result);
bool success =
application_manager::commands::IsMobileResultSuccess(mobile_result);
SendResponse(success,
correlation_id(),
hmi_apis::FunctionID::AppService_PerformAppServiceInteraction,
Expand Down
Loading

0 comments on commit 036b185

Please sign in to comment.