[mediacontroller] Get/set content age rating API implementation. 12/201112/9
authorMichal Michalski <m.michalski2@partner.samsung.com>
Thu, 7 Mar 2019 11:04:36 +0000 (12:04 +0100)
committerMichal Michalski <m.michalski2@partner.samsung.com>
Wed, 3 Apr 2019 06:55:32 +0000 (08:55 +0200)
http://suprem.sec.samsung.net/jira/browse/TWDAPI-207

[Verification] Manual testing.

Change-Id: I8ecea29c13f4cf97c08edfe2d6fd3a07799459d9
Signed-off-by: Michal Michalski <m.michalski2@partner.samsung.com>
src/mediacontroller/mediacontroller_api.js
src/mediacontroller/mediacontroller_client.cc
src/mediacontroller/mediacontroller_client.h
src/mediacontroller/mediacontroller_instance.cc
src/mediacontroller/mediacontroller_instance.h
src/mediacontroller/mediacontroller_server.cc
src/mediacontroller/mediacontroller_server.h
src/mediacontroller/mediacontroller_types.cc
src/mediacontroller/mediacontroller_types.h

index abe292c..b1070bd 100755 (executable)
@@ -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}
index 6ef3a29..c2c59d7 100644 (file)
@@ -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",
index 5951e85..f10243c 100644 (file)
@@ -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);
index 2ca1393..746efca 100644 (file)
@@ -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<std::string>();
+  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();
index 9b5c9a5..ea7173e 100644 (file)
@@ -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);
index ed413ca..a2a4da0 100644 (file)
@@ -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<int>(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<mc_content_age_rating_e>(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<mc_content_age_rating_e>(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<MediaControllerServer*>(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;
 
index 2678dbf..2c9a01d 100644 (file)
@@ -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_;
index ae099dc..3c03d5d 100644 (file)
@@ -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<int>(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();
 
index 6411d57..dc0ed4f 100644 (file)
@@ -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<std::string, int> const** platform_str);
+  static common::PlatformResult GetPlatformEnumMap(const std::string& type,
+                                                   std::map<std::string, int> 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);