From 7e7ae288c60d4995da06ad622acb59f0fa1076cf Mon Sep 17 00:00:00 2001 From: Michal Michalski Date: Thu, 7 Mar 2019 12:04:36 +0100 Subject: [PATCH] [mediacontroller] Get/set content age rating API implementation. http://suprem.sec.samsung.net/jira/browse/TWDAPI-207 [Verification] Manual testing. Change-Id: I8ecea29c13f4cf97c08edfe2d6fd3a07799459d9 Signed-off-by: Michal Michalski --- src/mediacontroller/mediacontroller_api.js | 52 ++++++++ src/mediacontroller/mediacontroller_client.cc | 23 +++- src/mediacontroller/mediacontroller_client.h | 4 +- .../mediacontroller_instance.cc | 23 ++++ .../mediacontroller_instance.h | 2 + src/mediacontroller/mediacontroller_server.cc | 39 +++++- src/mediacontroller/mediacontroller_server.h | 2 + src/mediacontroller/mediacontroller_types.cc | 111 ++++++++++++------ src/mediacontroller/mediacontroller_types.h | 8 +- 9 files changed, 214 insertions(+), 50 deletions(-) diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index abe292c5..b1070bdb 100755 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -214,6 +214,29 @@ var MediaControllerRepeatState = { REPEAT_ALL: "REPEAT_ALL" }; +var MediaControllerContentAgeRating = { + ALL: "ALL", + ONE: "1", + TWO: "2", + THREE: "3", + FOUR: "4", + FIVE: "5", + SIX: "6", + SEVEN: "7", + EIGHT: "8", + NINE: "9", + TEN: "10", + ELEVEN: "11", + TWELVE: "12", + THIRTEEN: "13", + FOURTEEN: "14", + FIFTEEN: "15", + SIXTEEN: "16", + SEVENTEEN: "17", + EIGHTEEN: "18", + NINETEEN: "19" +}; + function MediaControllerManager() {} MediaControllerManager.prototype.getClient = function() { @@ -321,6 +344,7 @@ var MediaControllerPlaybackInfo = function(data) { var _shuffleMode = false; var _repeatMode = false; var _repeatState = MediaControllerRepeatState.REPEAT_OFF; + var _ageRating = MediaControllerContentAgeRating.ALL; var _metadata = new MediaControllerMetadata(); Object.defineProperties(this, { state: { @@ -341,6 +365,15 @@ var MediaControllerPlaybackInfo = function(data) { }, enumerable: true }, + ageRating: { + get: function() { + return _ageRating; + }, + set: function(v) { + _ageRating = edit_.isAllowed && v ? v : _ageRating; + }, + enumerable: true + }, shuffleMode: { get: function() { return _shuffleMode; @@ -439,6 +472,25 @@ MediaControllerServer.prototype.updatePlaybackPosition = function(position) { edit_.disallow(); }; +MediaControllerServer.prototype.updatePlaybackAgeRating = function(rating) { + var args = validator_.validateArgs(arguments, [ + {name: 'rating', type: types_.ENUM, values: Object.values(MediaControllerContentAgeRating)} + ]); + + var data = { + rating: args.rating + }; + + var result = native_.callSync('MediaControllerServer_updatePlaybackAgeRating', data); + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } + + edit_.allow(); + this.playbackInfo.ageRating = args.rating; + edit_.disallow(); +}; + MediaControllerServer.prototype.updateShuffleMode = function(mode) { var args = validator_.validateArgs(arguments, [ {name: 'mode', type: types_.BOOLEAN} diff --git a/src/mediacontroller/mediacontroller_client.cc b/src/mediacontroller/mediacontroller_client.cc index 6ef3a294..c2c59d7d 100644 --- a/src/mediacontroller/mediacontroller_client.cc +++ b/src/mediacontroller/mediacontroller_client.cc @@ -43,8 +43,8 @@ MediaControllerClient::~MediaControllerClient() { int ret = mc_client_unset_cmd_reply_received_cb(handle_); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { - LoggerE("Failed to unset cmd reply callback. Error code: %d; Error message: %s", - ret, get_error_message(ret)); + LoggerE("Failed to unset cmd reply callback. Error code: %d; Error message: %s", ret, + get_error_message(ret)); } if (nullptr != server_status_listener_ && !UnsetServerStatusChangeListener()) { @@ -71,9 +71,10 @@ PlatformResult MediaControllerClient::Init() { ret = mc_client_set_cmd_reply_received_cb(handle_, OnCommandReply, this); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { - return LogAndCreateResult( - ErrorCode::UNKNOWN_ERR, "Unable to register cmd reply received callback", - ("mc_client_set_cmd_reply_received_cb() error: %d, message: %s", ret, get_error_message(ret))); + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, + "Unable to register cmd reply received callback", + ("mc_client_set_cmd_reply_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); } return PlatformResult(ErrorCode::NO_ERROR); @@ -202,6 +203,14 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ return result; } + // content age rating + std::string rating; + result = Types::ConvertContentAgeRating(playback_h, &rating); + if (!result) { + LoggerE("ConvertContentAgeRating failed, error: %s", result.message().c_str()); + return result; + } + // shuffle mode mc_shuffle_mode_e shuffle; ret = mc_client_get_server_shuffle_mode(handle_, server_name.c_str(), &shuffle); @@ -230,6 +239,7 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ // fill return object (*playback_info)["state"] = picojson::value(state); (*playback_info)["position"] = picojson::value(position); + (*playback_info)["ageRating"] = picojson::value(rating); (*playback_info)["shuffleMode"] = picojson::value(shuffle == MC_SHUFFLE_MODE_ON); (*playback_info)["repeatMode"] = picojson::value(repeat == MC_REPEAT_MODE_ON); (*playback_info)["metadata"] = metadata; @@ -504,7 +514,8 @@ PlatformResult MediaControllerClient::SendCommand(const std::string& server_name ("bundle_add(data) error: %d, message: %s", ret, get_error_message(ret))); } - ret = mc_client_send_custom_cmd(handle_, server_name.c_str(), command.c_str(), bundle, request_id); + ret = + mc_client_send_custom_cmd(handle_, server_name.c_str(), command.c_str(), bundle, &request_id); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult( ErrorCode::UNKNOWN_ERR, "Error sending custom command", diff --git a/src/mediacontroller/mediacontroller_client.h b/src/mediacontroller/mediacontroller_client.h index 5951e853..f10243c1 100644 --- a/src/mediacontroller/mediacontroller_client.h +++ b/src/mediacontroller/mediacontroller_client.h @@ -67,8 +67,8 @@ class MediaControllerClient { static void OnServerStatusUpdate(const char* server_name, mc_server_state_e state, void* user_data); - static void OnCommandReply(const char* server_name, const char* request_id, - int result_code, bundle* bundle, void* user_data); + static void OnCommandReply(const char* server_name, const char* request_id, int result_code, + bundle* bundle, void* user_data); static void OnPlaybackUpdate(const char* server_name, mc_playback_h playback, void* user_data); static void OnShuffleModeUpdate(const char* server_name, mc_shuffle_mode_e mode, void* user_data); static void OnRepeatModeUpdate(const char* server_name, mc_repeat_mode_e mode, void* user_data); diff --git a/src/mediacontroller/mediacontroller_instance.cc b/src/mediacontroller/mediacontroller_instance.cc index 2ca13935..746efcaa 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -56,6 +56,8 @@ MediaControllerInstance::MediaControllerInstance() { MediaControllerServerUpdatePlaybackState); REGISTER_SYNC("MediaControllerServer_updatePlaybackPosition", MediaControllerServerUpdatePlaybackPosition); + REGISTER_SYNC("MediaControllerServer_updatePlaybackAgeRating", + MediaControllerServerUpdatePlaybackAgeRating); REGISTER_SYNC("MediaControllerServer_updateRepeatMode", MediaControllerServerUpdateRepeatMode); REGISTER_SYNC("MediaControllerServer_updateRepeatState", MediaControllerServerUpdateRepeatState); REGISTER_SYNC("MediaControllerServer_updateShuffleMode", MediaControllerServerUpdateShuffleMode); @@ -174,6 +176,27 @@ void MediaControllerInstance::MediaControllerServerUpdatePlaybackPosition( ReportSuccess(out); } +void MediaControllerInstance::MediaControllerServerUpdatePlaybackAgeRating( + const picojson::value& args, picojson::object& out) { + ScopeLogger(); + if (!server_) { + LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Server handle not initialized."), + &out, ("Failed: server_")); + return; + } + + CHECK_EXIST(args, "rating", out) + + const std::string& rating = args.get("rating").get(); + const PlatformResult& result = server_->SetContentAgeRating(rating); + if (!result) { + LogAndReportError(result, &out, ("Failed: server_->SetContentAgeRating()")); + return; + } + + ReportSuccess(out); +} + void MediaControllerInstance::MediaControllerServerUpdateShuffleMode(const picojson::value& args, picojson::object& out) { ScopeLogger(); diff --git a/src/mediacontroller/mediacontroller_instance.h b/src/mediacontroller/mediacontroller_instance.h index 9b5c9a57..ea7173ea 100644 --- a/src/mediacontroller/mediacontroller_instance.h +++ b/src/mediacontroller/mediacontroller_instance.h @@ -37,6 +37,8 @@ class MediaControllerInstance : public common::ParsedInstance { void MediaControllerServerUpdatePlaybackState(const picojson::value& args, picojson::object& out); void MediaControllerServerUpdatePlaybackPosition(const picojson::value& args, picojson::object& out); + void MediaControllerServerUpdatePlaybackAgeRating(const picojson::value& args, + picojson::object& out); void MediaControllerServerUpdateRepeatMode(const picojson::value& args, picojson::object& out); void MediaControllerServerUpdateRepeatState(const picojson::value& args, picojson::object& out); void MediaControllerServerUpdateShuffleMode(const picojson::value& args, picojson::object& out); diff --git a/src/mediacontroller/mediacontroller_server.cc b/src/mediacontroller/mediacontroller_server.cc index ed413ca1..a2a4da02 100644 --- a/src/mediacontroller/mediacontroller_server.cc +++ b/src/mediacontroller/mediacontroller_server.cc @@ -35,6 +35,7 @@ MediaControllerServer::MediaControllerServer() : handle_(nullptr), playback_state_(MC_PLAYBACK_STATE_STOPPED), position_(0ULL), + age_rating_(MC_CONTENT_RATING_ALL), shuffle_mode_(MC_SHUFFLE_MODE_OFF), repeat_mode_(MC_REPEAT_MODE_OFF), is_shuffle_mode_set_(false), @@ -134,6 +135,37 @@ PlatformResult MediaControllerServer::SetPlaybackPosition(double position) { return PlatformResult(ErrorCode::NO_ERROR); } +PlatformResult MediaControllerServer::SetContentAgeRating(const std::string& rating) { + ScopeLogger(); + + int rating_int = static_cast(MC_CONTENT_RATING_ALL); + PlatformResult result = + Types::StringToPlatformEnum(Types::kMediaControllerContentAgeRating, rating, &rating_int); + + if (!result) { + return result; + } + + int ret = + mc_server_set_content_age_rating(handle_, static_cast(rating_int)); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error setting content age rating", + ("mc_server_set_content_age_rating() error: %d, message: %s", ret, get_error_message(ret))); + } + + age_rating_ = static_cast(rating_int); + + ret = mc_server_update_playback_info(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error updating playback info", + ("mc_server_update_playback_info() error: %d, message: %s", ret, get_error_message(ret))); + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + PlatformResult MediaControllerServer::SetShuffleMode(bool mode) { ScopeLogger(); @@ -237,7 +269,8 @@ PlatformResult MediaControllerServer::SetMetadata(const picojson::object& metada } void MediaControllerServer::OnCommandReceived(const char* client_name, const char* request_id, - const char* command, bundle* bundle, void* user_data) { + const char* command, bundle* bundle, + void* user_data) { ScopeLogger(); MediaControllerServer* server = static_cast(user_data); @@ -308,8 +341,8 @@ PlatformResult MediaControllerServer::SetCommandListener(const JsonCallback& cal int ret = mc_server_set_custom_cmd_received_cb(handle_, OnCommandReceived, this); if (MEDIA_CONTROLLER_ERROR_NONE != ret) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to set command callback", - ("mc_server_set_custom_cmd_received_cb() error: %d, message: %s", - ret, get_error_message(ret))); + ("mc_server_set_custom_cmd_received_cb() error: %d, message: %s", ret, + get_error_message(ret))); } command_listener_ = callback; diff --git a/src/mediacontroller/mediacontroller_server.h b/src/mediacontroller/mediacontroller_server.h index 2678dbfa..2c9a01dc 100644 --- a/src/mediacontroller/mediacontroller_server.h +++ b/src/mediacontroller/mediacontroller_server.h @@ -34,6 +34,7 @@ class MediaControllerServer { common::PlatformResult Init(); common::PlatformResult SetPlaybackState(const std::string& state); common::PlatformResult SetPlaybackPosition(double position); + common::PlatformResult SetContentAgeRating(const std::string& rating); common::PlatformResult SetShuffleMode(bool mode); common::PlatformResult SetRepeatMode(bool mode); common::PlatformResult SetRepeatState(const std::string& state); @@ -54,6 +55,7 @@ class MediaControllerServer { JsonCallback change_request_playback_info_listener_; mc_playback_states_e playback_state_; unsigned long long position_; + mc_content_age_rating_e age_rating_; mc_shuffle_mode_e shuffle_mode_; mc_repeat_mode_e repeat_mode_; bool is_shuffle_mode_set_; diff --git a/src/mediacontroller/mediacontroller_types.cc b/src/mediacontroller/mediacontroller_types.cc index ae099dca..3c03d5db 100644 --- a/src/mediacontroller/mediacontroller_types.cc +++ b/src/mediacontroller/mediacontroller_types.cc @@ -33,43 +33,58 @@ const std::string Types::kMediaControllerPlaybackState = "MediaControllerPlaybac const std::string Types::kMediaControllerPlaybackAction = "MediaControllerPlaybackAction"; const std::string Types::kMediaControllerMetadataAttribute = "MediaControllerMetadataAttribute"; const std::string Types::kMediaControllerRepeatState = "MediaControllerRepeatState"; - -const PlatformEnumMap Types::platform_enum_map_ = {{kMediaControllerServerState, - {{"NONE", MC_SERVER_STATE_NONE}, - {"ACTIVE", MC_SERVER_STATE_ACTIVATE}, - {"INACTIVE", MC_SERVER_STATE_DEACTIVATE}}}, - {kMediaControllerPlaybackState, - {{"PLAY", MC_PLAYBACK_STATE_PLAYING}, - {"PAUSE", MC_PLAYBACK_STATE_PAUSED}, - {"STOP", MC_PLAYBACK_STATE_STOPPED}, - {"NEXT", MC_PLAYBACK_STATE_MOVING_TO_NEXT}, - {"PREV", MC_PLAYBACK_STATE_MOVING_TO_PREVIOUS}, - {"FORWARD", MC_PLAYBACK_STATE_FAST_FORWARDING}, - {"REWIND", MC_PLAYBACK_STATE_REWINDING}}}, - {kMediaControllerPlaybackAction, - {{"PLAY", MC_PLAYBACK_ACTION_PLAY}, - {"PAUSE", MC_PLAYBACK_ACTION_PAUSE}, - {"STOP", MC_PLAYBACK_ACTION_STOP}, - {"NEXT", MC_PLAYBACK_ACTION_NEXT}, - {"PREV", MC_PLAYBACK_ACTION_PREV}, - {"FORWARD", MC_PLAYBACK_ACTION_FAST_FORWARD}, - {"REWIND", MC_PLAYBACK_ACTION_REWIND}}}, - {kMediaControllerMetadataAttribute, - {{"title", MC_META_MEDIA_TITLE}, - {"artist", MC_META_MEDIA_ARTIST}, - {"album", MC_META_MEDIA_ALBUM}, - {"author", MC_META_MEDIA_AUTHOR}, - {"genre", MC_META_MEDIA_GENRE}, - {"duration", MC_META_MEDIA_DURATION}, - {"date", MC_META_MEDIA_DATE}, - {"copyright", MC_META_MEDIA_COPYRIGHT}, - {"description", MC_META_MEDIA_DESCRIPTION}, - {"trackNum", MC_META_MEDIA_TRACK_NUM}, - {"picture", MC_META_MEDIA_PICTURE}}}, - {kMediaControllerRepeatState, - {{"REPEAT_OFF", MC_REPEAT_MODE_OFF}, - {"REPEAT_ONE", MC_REPEAT_MODE_ONE_MEDIA}, - {"REPEAT_ALL", MC_REPEAT_MODE_ON}}}}; +const std::string Types::kMediaControllerContentAgeRating = "MediaControllerContentAgeRationg"; + +const PlatformEnumMap Types::platform_enum_map_ = { + {kMediaControllerServerState, + {{"NONE", MC_SERVER_STATE_NONE}, + {"ACTIVE", MC_SERVER_STATE_ACTIVATE}, + {"INACTIVE", MC_SERVER_STATE_DEACTIVATE}}}, + {kMediaControllerPlaybackState, + {{"PLAY", MC_PLAYBACK_STATE_PLAYING}, + {"PAUSE", MC_PLAYBACK_STATE_PAUSED}, + {"STOP", MC_PLAYBACK_STATE_STOPPED}, + {"NEXT", MC_PLAYBACK_STATE_MOVING_TO_NEXT}, + {"PREV", MC_PLAYBACK_STATE_MOVING_TO_PREVIOUS}, + {"FORWARD", MC_PLAYBACK_STATE_FAST_FORWARDING}, + {"REWIND", MC_PLAYBACK_STATE_REWINDING}}}, + {kMediaControllerPlaybackAction, + {{"PLAY", MC_PLAYBACK_ACTION_PLAY}, + {"PAUSE", MC_PLAYBACK_ACTION_PAUSE}, + {"STOP", MC_PLAYBACK_ACTION_STOP}, + {"NEXT", MC_PLAYBACK_ACTION_NEXT}, + {"PREV", MC_PLAYBACK_ACTION_PREV}, + {"FORWARD", MC_PLAYBACK_ACTION_FAST_FORWARD}, + {"REWIND", MC_PLAYBACK_ACTION_REWIND}}}, + {kMediaControllerMetadataAttribute, + {{"title", MC_META_MEDIA_TITLE}, + {"artist", MC_META_MEDIA_ARTIST}, + {"album", MC_META_MEDIA_ALBUM}, + {"author", MC_META_MEDIA_AUTHOR}, + {"genre", MC_META_MEDIA_GENRE}, + {"duration", MC_META_MEDIA_DURATION}, + {"date", MC_META_MEDIA_DATE}, + {"copyright", MC_META_MEDIA_COPYRIGHT}, + {"description", MC_META_MEDIA_DESCRIPTION}, + {"trackNum", MC_META_MEDIA_TRACK_NUM}, + {"picture", MC_META_MEDIA_PICTURE}}}, + {kMediaControllerRepeatState, + {{"REPEAT_OFF", MC_REPEAT_MODE_OFF}, + {"REPEAT_ONE", MC_REPEAT_MODE_ONE_MEDIA}, + {"REPEAT_ALL", MC_REPEAT_MODE_ON}}}, + {kMediaControllerContentAgeRating, + { + {"ALL", MC_CONTENT_RATING_ALL}, {"1", MC_CONTENT_RATING_1_PLUS}, + {"2", MC_CONTENT_RATING_2_PLUS}, {"3", MC_CONTENT_RATING_3_PLUS}, + {"4", MC_CONTENT_RATING_4_PLUS}, {"5", MC_CONTENT_RATING_5_PLUS}, + {"6", MC_CONTENT_RATING_6_PLUS}, {"7", MC_CONTENT_RATING_7_PLUS}, + {"8", MC_CONTENT_RATING_8_PLUS}, {"9", MC_CONTENT_RATING_9_PLUS}, + {"10", MC_CONTENT_RATING_10_PLUS}, {"11", MC_CONTENT_RATING_11_PLUS}, + {"12", MC_CONTENT_RATING_12_PLUS}, {"13", MC_CONTENT_RATING_13_PLUS}, + {"14", MC_CONTENT_RATING_14_PLUS}, {"15", MC_CONTENT_RATING_15_PLUS}, + {"16", MC_CONTENT_RATING_16_PLUS}, {"17", MC_CONTENT_RATING_17_PLUS}, + {"18", MC_CONTENT_RATING_18_PLUS}, {"19", MC_CONTENT_RATING_19_PLUS}, + }}}; PlatformEnumReverseMap Types::platform_enum_reverse_map_ = {}; @@ -164,6 +179,28 @@ PlatformResult Types::ConvertPlaybackState(mc_playback_h playback_h, std::string return PlatformResult(ErrorCode::NO_ERROR); } +PlatformResult Types::ConvertContentAgeRating(mc_playback_h playback_h, std::string* rating) { + ScopeLogger(); + + mc_content_age_rating_e rating_e = MC_CONTENT_RATING_ALL; + int ret = mc_client_get_age_rating(playback_h, &rating_e); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error getting content age rating", + ("mc_client_get_age_rating() error: %d, message: %s", ret, get_error_message(ret))); + } + + PlatformResult result = Types::PlatformEnumToString(Types::kMediaControllerContentAgeRating, + static_cast(rating_e), rating); + + if (!result) { + LoggerE("PlatformEnumToString failed, error: %s", result.message().c_str()); + return result; + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + PlatformResult Types::ConvertPlaybackPosition(mc_playback_h playback_h, double* position) { ScopeLogger(); diff --git a/src/mediacontroller/mediacontroller_types.h b/src/mediacontroller/mediacontroller_types.h index 6411d574..dc0ed4f9 100644 --- a/src/mediacontroller/mediacontroller_types.h +++ b/src/mediacontroller/mediacontroller_types.h @@ -38,9 +38,10 @@ class Types { static const std::string kMediaControllerPlaybackAction; static const std::string kMediaControllerMetadataAttribute; static const std::string kMediaControllerRepeatState; + static const std::string kMediaControllerContentAgeRating; - static common::PlatformResult GetPlatformEnumMap( - const std::string& type, std::map const** platform_str); + static common::PlatformResult GetPlatformEnumMap(const std::string& type, + std::map const** platform_str); static common::PlatformResult StringToPlatformEnum(const std::string& type, const std::string& value, int* platform_enum); @@ -49,6 +50,9 @@ class Types { std::string* platform_str); static common::PlatformResult ConvertPlaybackState(mc_playback_h playback_h, std::string* state); + static common::PlatformResult ConvertContentAgeRating(mc_playback_h playback_h, + std::string* state); + static common::PlatformResult ConvertPlaybackPosition(mc_playback_h playback_h, double* position); static common::PlatformResult ConvertMetadata(mc_metadata_h metadata_h, picojson::object* metadata); -- 2.34.1