[Mediacontroller] added display rotation feature 28/213828/13
authorRafal Walczyna <r.walczyna@samsung.com>
Fri, 13 Sep 2019 13:23:21 +0000 (15:23 +0200)
committerPiotr Kosko <p.kosko@samsung.com>
Thu, 19 Sep 2019 11:06:49 +0000 (11:06 +0000)
[Verification] Code compiles without errors.
Basic test in chrome console works properly.

/// 1. adding command listener
var mcServer = tizen.mediacontroller.createServer();
mcServer.updatePlaybackState("PLAY");
var changeListener = function(clientName, rotation)
{
  console.log("Display rotation change requested to: " + rotation + " by " + clientName);
  return new tizen.mediacontroller.RequestReply(new tizen.Bundle({"message": "Success"}), 0);
};
watcherId = mcServer.displayRotation.addChangeRequestListener(changeListener);

/// 2. checking NotSupportedError when sending without enabled ability
var mcClient = tizen.mediacontroller.getClient();
var mcServerInfo = mcClient.getLatestServerInfo()
var rotation = "ROTATION_180";
mcServerInfo.displayRotation.sendRequest(rotation,
    function(data, code)
    {
      console.log(
          "Server replied with return data: " + JSON.stringify(data) + " and code: " + code);
    });

/// 3. register listener for mode changes (client side)
watcherId = mcServerInfo.displayRotation.addDisplayRotationChangeListener(function(rotation)
{
  console.log(mcServerInfo.name + " server display rotation changed to " + rotation);
});

/// 4. change the value of mode 360 (should trigger listener from point 3)
mcServer.displayRotation.displayRotation = "ROTATION_180"

/// 5. enable ability of server
// TODO: mcServer.abilities.displayRotation = "?"

/// sendRequest again (should trigger listener from point 1)
mcServerInfo.displayRotation.sendRequest(rotation,
  function(data, code)
  {
    console.log(
        "Server replied with return data: " + JSON.stringify(data) + " and code: " + code);
  });

Change-Id: I9c497dbaaf5e7f491c2d57c568e52581c980951d
Signed-off-by: Rafal Walczyna <r.walczyna@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_utils.cc
src/mediacontroller/mediacontroller_utils.h

index 3fbf321faf99f92a5d24e74c51cd603d71b7508f..06ef8eecf6668cf6ae7a7eca10228adb9ac09723 100755 (executable)
@@ -369,6 +369,13 @@ var MediaControllerDisplayModeType = {
     CROPPED_FULL: 'CROPPED_FULL'
 };
 
+var MediaControllerDisplayRotationType = {
+    ROTATION_NONE: 'ROTATION_NONE',
+    ROTATION_90: 'ROTATION_90',
+    ROTATION_180: 'ROTATION_180',
+    ROTATION_270: 'ROTATION_270'
+};
+
 function MediaControllerManager() {}
 
 MediaControllerManager.prototype.getClient = function() {
@@ -1614,9 +1621,213 @@ var MediaControllerDisplayModeInfo = function(name) {
     };
 };
 
-// TODO displayRotation
-var MediaControllerDisplayRotation = function() {};
-var MediaControllerDisplayRotationInfo = function() {};
+// displayRotation
+var MediaControllerDisplayRotation = function() {
+    // the default value is "ROTATION_NONE"
+    var _displayRotation = MediaControllerDisplayRotationType.ROTATION_NONE;
+    Object.defineProperties(this, {
+        displayRotation: {
+            get: function() {
+                return _displayRotation;
+            },
+            set: function(v) {
+                var args = validator_.validateArgs(arguments, [
+                    {
+                        name: 'displayRotation',
+                        type: types_.ENUM,
+                        values: Object.keys(MediaControllerDisplayRotationType)
+                    }
+                ]);
+                if (args.displayRotation == _displayRotation) {
+                    return;
+                }
+                var result = native_.callSync(
+                    'MediaControllerDisplayRotation_updateDisplayRotation',
+                    args
+                );
+                if (native_.isFailure(result)) {
+                    throw native_.getErrorObject(result);
+                }
+                _displayRotation = args.displayRotation;
+            },
+            enumerable: true
+        }
+    });
+};
+
+var MediaControllerDisplayRotationListener = new ListenerManager(
+    native_,
+    '_MediaControllerDisplayRotationListener',
+    function(msg, listener) {
+        var reply = listener(msg.clientName, msg.displayRotation);
+
+        if (!(reply instanceof RequestReply)) {
+            reply = new RequestReply(type_.isNullOrUndefined(reply) ? null : reply, 0);
+        }
+
+        var nativeData = {
+            clientName: msg.clientName,
+            requestId: msg.requestId,
+            reply: reply
+        };
+        var result = native_.callSync('MediaControllerServer_replyCommand', nativeData);
+        if (native_.isFailure(result)) {
+            throw native_.getErrorObject(result);
+        }
+    }
+);
+
+MediaControllerDisplayRotation.prototype.addChangeRequestListener = function() {
+    var args = validator_.validateArgs(arguments, [
+        {
+            name: 'listener',
+            type: types_.FUNCTION,
+            optional: false,
+            nullable: false
+        }
+    ]);
+
+    if (type_.isEmptyObject(MediaControllerDisplayRotationListener.listeners)) {
+        var result = native_.callSync(
+            'MediaControllerDisplayRotation_addChangeRequestListener',
+            {
+                listenerId: MediaControllerDisplayRotationListener.listenerName
+            }
+        );
+        if (native_.isFailure(result)) {
+            throw native_.getErrorObject(result);
+        }
+    }
+    return MediaControllerDisplayRotationListener.addListener(args.listener);
+};
+
+MediaControllerDisplayRotation.prototype.removeChangeRequestListener = function(watchId) {
+    var args = validator_.validateArgs(arguments, [
+        { name: 'watchId', type: types_.LONG }
+    ]);
+
+    MediaControllerDisplayRotationListener.removeListener(args.watchId);
+
+    if (type_.isEmptyObject(MediaControllerDisplayRotationListener.listeners)) {
+        var result = native_.callSync(
+            'MediaControllerDisplayRotation_removeChangeRequestListener'
+        );
+        if (native_.isFailure(result)) {
+            throw native_.getErrorObject(result);
+        }
+    }
+};
+
+var MediaControllerDisplayRotationChangeListener = new ListenerManager(
+    native_,
+    '_MediaControllerDisplayRotationChangeListener',
+    function(msg, listener) {
+        listener(msg.displayRotation);
+    }
+);
+
+var MediaControllerDisplayRotationInfo = function(name) {
+    var _serverName = name;
+    Object.defineProperties(this, {
+        displayRotation: {
+            get: function() {
+                var result = native_.callSync(
+                    'MediaControllerDisplayRotationInfo_getDisplayRotation',
+                    {
+                        name: _serverName
+                    }
+                );
+                if (native_.isFailure(result)) {
+                    throw new native_.getErrorObject(result);
+                }
+                return native_.getResultObject(result);
+            },
+            set: function(v) {},
+            enumerable: true
+        }
+    });
+
+    this.sendRequest = function() {
+        var args = validator_.validateArgs(arguments, [
+            {
+                name: 'displayRotation',
+                type: types_.ENUM,
+                values: Object.keys(MediaControllerDisplayRotationType)
+            },
+            {
+                name: 'replyCallback',
+                type: types_.FUNCTION,
+                optional: false,
+                nullable: false
+            }
+        ]);
+        var callback = function(result) {
+            native_.callIfPossible(
+                args.replyCallback,
+                native_.getResultObject(result).data,
+                native_.getResultObject(result).code
+            );
+        };
+
+        var nativeData = {
+            displayRotation: args.displayRotation,
+            name: _serverName,
+            listenerId: ReplyCommandListener.listenerName
+        };
+
+        var result = native_.callSync(
+            'MediaControllerDisplayRotationInfo_sendRequest',
+            nativeData
+        );
+        if (native_.isFailure(result)) {
+            throw native_.getErrorObject(result);
+        }
+
+        var replyListenerId = ReplyCommandListener.addListener(callback);
+        ReplyCommandListener.requestIdToListenerId[replyListenerId] = result.requestId;
+    };
+
+    this.addDisplayRotationChangeListener = function(listener) {
+        var args = validator_.validateArgs(arguments, [
+            { name: 'listener', type: types_.FUNCTION }
+        ]);
+
+        if (type_.isEmptyObject(MediaControllerDisplayRotationChangeListener.listeners)) {
+            var result = native_.callSync(
+                'MediaControllerDisplayRotationInfo_addDisplayRotationChangeListener',
+                {
+                    listenerId: MediaControllerDisplayRotationChangeListener.listenerName
+                }
+            );
+            if (native_.isFailure(result)) {
+                throw native_.getErrorObject(result);
+            }
+        }
+        return MediaControllerDisplayRotationChangeListener.addServerInfoListener(
+            args.listener,
+            _serverName
+        );
+    };
+
+    this.removeDisplayRotationChangeListener = function(watchId) {
+        var args = validator_.validateArgs(arguments, [
+            { name: 'watchId', type: types_.LONG }
+        ]);
+
+        MediaControllerDisplayRotationChangeListener.removeServerInfoListener(
+            args.watchId
+        );
+
+        if (type_.isEmptyObject(MediaControllerDisplayRotationChangeListener.listeners)) {
+            var result = native_.callSync(
+                'MediaControllerDisplayRotationInfo_removeDisplayRotationChangeListener'
+            );
+            if (native_.isFailure(result)) {
+                throw native_.getErrorObject(result);
+            }
+        }
+    };
+};
 
 function MediaControllerServer(data) {
     var _iconURI = null;
@@ -2544,7 +2755,7 @@ function MediaControllerServerInfo(data) {
             writable: false
         },
         displayRotation: {
-            value: new MediaControllerDisplayRotationInfo(),
+            value: new MediaControllerDisplayRotationInfo(data.name),
             enumerable: true,
             writable: false
         }
index 2f3e7c5e7ce63d7df048eb641194ebb5729021cc..2a42739ecf6977883377e6eaffef77398617e6b9 100644 (file)
@@ -75,6 +75,10 @@ MediaControllerClient::~MediaControllerClient() {
     LoggerE("Failed to unset display mode listener");
   }
 
+  if (nullptr != display_rotation_update_listener && !UnsetDisplayRotationInfoChangeListener()) {
+    LoggerE("Failed to unset display rotation listener");
+  }
+
   if (nullptr != handle_ && MEDIA_CONTROLLER_ERROR_NONE != mc_client_destroy(handle_)) {
     LoggerE("Unable to destroy media controller client");
   }
@@ -1404,7 +1408,112 @@ void MediaControllerClient::OnDisplayModeUpdate(const char* server_name, mc_disp
   client->display_mode_update_listener_(&data);
 }
 
-// TODO displayRotation
+// displayRotation
+PlatformResult MediaControllerClient::GetDisplayRotation(const std::string& name,
+                                                         std::string* display_rotation) {
+  ScopeLogger();
+  mc_display_rotation_e rotation = MC_DISPLAY_ROTATION_NONE;
+
+  int ret = mc_client_get_server_display_rotation(handle_, name.c_str(), &rotation);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error getting display rotation",
+                              ("mc_client_get_server_display_rotation() error: %d, message: %s",
+                               ret, get_error_message(ret)));
+  }
+
+  PlatformResult result =
+      types::MediaControllerDisplayRotationEnum.getName(rotation, display_rotation);
+  if (!result) {
+    LoggerE("MediaControllerDisplayRotationEnum.getName() failed, error: %s",
+            result.message().c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR);
+  }
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerClient::SendDisplayRotation(const std::string& server_name,
+                                                          const std::string& display_rotation,
+                                                          const JsonCallback& reply_cb,
+                                                          char** request_id) {
+  ScopeLogger("Rotation to send: %s", display_rotation.c_str());
+  mc_display_rotation_e rotation = MC_DISPLAY_ROTATION_NONE;
+  PlatformResult result =
+      types::MediaControllerDisplayRotationEnum.getValue(display_rotation, &rotation);
+  if (!result) {
+    LoggerE("MediaControllerDisplayRotationEnum.getValue() failed, error: %s",
+            result.message().c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR);
+  }
+
+  int ret = mc_client_send_display_rotation_cmd(handle_, server_name.c_str(), rotation, request_id);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(utils::ConvertMediaControllerError(ret),
+                              "Error sending display rotation command",
+                              ("mc_client_send_display_rotation_cmd() error: %d, message: %s", ret,
+                               get_error_message(ret)));
+  }
+
+  command_reply_callback_ = reply_cb;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerClient::SetDisplayRotationInfoChangeListener(
+    const JsonCallback& callback) {
+  ScopeLogger();
+
+  if (nullptr != display_rotation_update_listener) {
+    LoggerD("Native callback already set");
+    return PlatformResult(ErrorCode::NO_ERROR);
+  }
+
+  int ret = mc_client_set_display_rotation_updated_cb(handle_, OnDisplayRotationUpdate, this);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to set display rotation listener",
+                              ("mc_client_set_display_rotation_updated_cb() error: %d, message: %s",
+                               ret, get_error_message(ret)));
+  }
+
+  display_rotation_update_listener = callback;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerClient::UnsetDisplayRotationInfoChangeListener() {
+  ScopeLogger();
+  int ret = mc_client_unset_display_rotation_updated_cb(handle_);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::UNKNOWN_ERR, "Unable to unset display rotation listener",
+        ("mc_client_unset_display_rotation_updated_cb() error: %d, message: %s", ret,
+         get_error_message(ret)));
+  }
+  display_rotation_update_listener = nullptr;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void MediaControllerClient::OnDisplayRotationUpdate(const char* server_name,
+                                                    mc_display_rotation_e rotation,
+                                                    void* user_data) {
+  ScopeLogger();
+  MediaControllerClient* client = static_cast<MediaControllerClient*>(user_data);
+
+  picojson::value data = picojson::value(picojson::object());
+  picojson::object& data_o = data.get<picojson::object>();
+
+  std::string display_rotation;
+  PlatformResult result =
+      types::MediaControllerDisplayRotationEnum.getName(rotation, &display_rotation);
+  if (!result) {
+    LoggerW("MediaControllerDisplayRotationEnum.getName() failed, error: %s, ignoring event",
+            result.message().c_str());
+    return;
+  }
+
+  data_o["displayRotation"] = picojson::value(display_rotation);
+  data_o["name"] = picojson::value(server_name);
+
+  client->display_rotation_update_listener(&data);
+}
 
 }  // namespace mediacontroller
 }  // namespace extension
index b3d245a80caf0e94d8d31603513427ddec0e2f7e..a7420de54d7402610a73e54f96fe392f13f47af9 100644 (file)
@@ -92,7 +92,13 @@ class MediaControllerClient {
                                              char** request_id);
   common::PlatformResult SetDisplayModeInfoChangeListener(const JsonCallback& callback);
   common::PlatformResult UnsetDisplayModeInfoChangeListener();
-  // TODO displayRotation
+  // displayRotation
+  common::PlatformResult GetDisplayRotation(const std::string& name, std::string* display_rotation);
+  common::PlatformResult SendDisplayRotation(const std::string& server_name,
+                                             const std::string& display_rotation,
+                                             const JsonCallback& reply_cb, char** request_id);
+  common::PlatformResult SetDisplayRotationInfoChangeListener(const JsonCallback& callback);
+  common::PlatformResult UnsetDisplayRotationInfoChangeListener();
 
  private:
   mc_client_h handle_;
@@ -108,6 +114,8 @@ class MediaControllerClient {
   JsonCallback mode360_update_listener_;
   // display mode
   JsonCallback display_mode_update_listener_;
+  // displayRotation
+  JsonCallback display_rotation_update_listener;
 
   std::list<std::string> subscribed_servers;
 
@@ -133,7 +141,9 @@ class MediaControllerClient {
   static void OnMode360Update(const char* server_name, bool enabled, void* user_data);
   // displayMode
   static void OnDisplayModeUpdate(const char* server_name, mc_display_mode_e mode, void* user_data);
-  // TODO displayRotation
+  // displayRotation
+  static void OnDisplayRotationUpdate(const char* server_name, mc_display_rotation_e rotation,
+                                      void* user_data);
 };
 
 }  // namespace mediacontroller
index cc0a770d9ff6b49eceba7fdc463743ed90c88146..1a9899d9fd4eb440427944fbbcebc376a0e703e5 100644 (file)
@@ -196,7 +196,22 @@ MediaControllerInstance::MediaControllerInstance() {
   REGISTER_SYNC("MediaControllerDisplayModeInfo_removeModeChangeListener",
                 MediaControllerDisplayModeInfoRemoveModeChangeListener);
 
-// TODO displayRotation
+  // displayRotation
+  REGISTER_SYNC("MediaControllerDisplayRotation_updateDisplayRotation",
+                MediaControllerDisplayRotationUpdate);
+  REGISTER_SYNC("MediaControllerDisplayRotation_addChangeRequestListener",
+                MediaControllerDisplayRotationAddChangeRequestListener);
+  REGISTER_SYNC("MediaControllerDisplayRotation_removeChangeRequestListener",
+                MediaControllerDisplayRotationRemoveChangeRequestListener);
+
+  REGISTER_SYNC("MediaControllerDisplayRotationInfo_getDisplayRotation",
+                MediaControllerDisplayRotationInfoGet);
+  REGISTER_ASYNC("MediaControllerDisplayRotationInfo_sendRequest",
+                 MediaControllerDisplayRotationInfoSend);
+  REGISTER_SYNC("MediaControllerDisplayRotationInfo_addDisplayRotationChangeListener",
+                MediaControllerDisplayRotationInfoAddChangeListener);
+  REGISTER_SYNC("MediaControllerDisplayRotationInfo_removeDisplayRotationChangeListener",
+                MediaControllerDisplayRotationInfoRemoveChangeListener);
 
 #undef REGISTER_SYNC
 #undef REGISTER_ASYNC
@@ -2167,7 +2182,188 @@ void MediaControllerInstance::MediaControllerDisplayModeInfoRemoveModeChangeList
   ReportSuccess(out);
 }
 
-// TODO displayRotation
+// displayRotation
+void MediaControllerInstance::MediaControllerDisplayRotationUpdate(const picojson::value& args,
+                                                                   picojson::object& out) {
+  ScopeLogger();
+
+  if (!server_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
+                      ("Failed: server_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "displayRotation", std::string, out)
+
+  const std::string display_rotation = args.get("displayRotation").get<std::string>();
+  PlatformResult result = server_->UpdateDisplayRotation(display_rotation);
+  if (!result) {
+    LogAndReportError(result, &out, ("Failed server_->UpdateDisplayRotation()"));
+    return;
+  }
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayRotationAddChangeRequestListener(
+    const picojson::value& args, picojson::object& out) {
+  ScopeLogger();
+  if (!server_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
+                      ("Failed: server_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "listenerId", std::string, out)
+
+  JsonCallback callback = [this, args](picojson::value* data) -> void {
+    if (!data) {
+      LoggerE("No data passed to json callback");
+      return;
+    }
+    picojson::object& request_o = data->get<picojson::object>();
+    request_o["listenerId"] = args.get("listenerId");
+
+    Instance::PostMessage(this, data->serialize().c_str());
+  };
+
+  auto result = server_->SetDisplayRotationChangeRequestListener(callback);
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayRotationRemoveChangeRequestListener(
+    const picojson::value& args, picojson::object& out) {
+  ScopeLogger();
+  if (!server_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
+                      ("Failed: server_"));
+    return;
+  }
+
+  auto result = server_->UnsetDisplayRotationChangeRequestListener();
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayRotationInfoGet(const picojson::value& args,
+                                                                    picojson::object& out) {
+  ScopeLogger();
+  if (!client_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
+                      ("Failed: client_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "name", std::string, out)
+
+  std::string rotation;
+  PlatformResult result =
+      client_->GetDisplayRotation(args.get("name").get<std::string>(), &rotation);
+
+  if (!result) {
+    LogAndReportError(result, &out, ("Failed: client_->GetDisplayRotation"));
+    return;
+  }
+
+  ReportSuccess(picojson::value(rotation), out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayRotationInfoSend(const picojson::value& args,
+                                                                     picojson::object& out) {
+  ScopeLogger();
+  if (!client_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occurred."), &out,
+                      ("Failed: client_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "listenerId", std::string, out)
+  CHECK_ARGS(args, "name", std::string, out)
+  CHECK_ARGS(args, "displayRotation", std::string, out)
+
+  JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
+    if (reply) {
+      picojson::object& reply_obj = reply->get<picojson::object>();
+      reply_obj["listenerId"] = args.get("listenerId");
+      Instance::PostMessage(this, reply->serialize().c_str());
+    } else {
+      LoggerW("No reply passed to json callback, ignoring");
+    }
+  };
+
+  char* request_id = nullptr;
+  SCOPE_EXIT {
+    free(request_id);
+  };
+
+  PlatformResult result = client_->SendDisplayRotation(
+      args.get("name").get<std::string>(), args.get("displayRotation").get<std::string>(), reply_cb,
+      &request_id);
+
+  if (result) {
+    ReportSuccess(out);
+    out["requestId"] = picojson::value(std::string(request_id));
+  } else {
+    LogAndReportError(result, &out, ("Failed to send display rotation command."));
+  }
+}
+
+void MediaControllerInstance::MediaControllerDisplayRotationInfoAddChangeListener(
+    const picojson::value& args, picojson::object& out) {
+  ScopeLogger();
+  if (!client_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
+                      ("Failed: client_"));
+    return;
+  }
+
+  CHECK_ARGS(args, "listenerId", std::string, out)
+
+  JsonCallback callback = [this, args](picojson::value* data) -> void {
+    if (nullptr == data) {
+      LoggerE("No data passed to json callback");
+      return;
+    }
+
+    picojson::object& request_o = data->get<picojson::object>();
+    request_o["listenerId"] = args.get("listenerId");
+
+    Instance::PostMessage(this, data->serialize().c_str());
+  };
+
+  auto result = client_->SetDisplayRotationInfoChangeListener(callback);
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayRotationInfoRemoveChangeListener(
+    const picojson::value& args, picojson::object& out) {
+  ScopeLogger();
+  if (!client_) {
+    LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out,
+                      ("Failed: client_"));
+    return;
+  }
+
+  auto result = client_->UnsetDisplayRotationInfoChangeListener();
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
 
 #undef CHECK_EXIST
 
index bfd4105517c29f027cad3476c00fdd35294dc0f5..0c9e3e88908e07043bb87702892de96026d4c224 100644 (file)
@@ -157,7 +157,19 @@ class MediaControllerInstance : public common::ParsedInstance {
                                                            picojson::object& out);
   void MediaControllerDisplayModeInfoRemoveModeChangeListener(const picojson::value& args,
                                                               picojson::object& out);
-  // TODO displayRotation
+
+  // displayRotation
+  void MediaControllerDisplayRotationUpdate(const picojson::value& args, picojson::object& out);
+  void MediaControllerDisplayRotationAddChangeRequestListener(const picojson::value& args,
+                                                              picojson::object& out);
+  void MediaControllerDisplayRotationRemoveChangeRequestListener(const picojson::value& args,
+                                                                 picojson::object& out);
+  void MediaControllerDisplayRotationInfoGet(const picojson::value& args, picojson::object& out);
+  void MediaControllerDisplayRotationInfoSend(const picojson::value& args, picojson::object& out);
+  void MediaControllerDisplayRotationInfoAddChangeListener(const picojson::value& args,
+                                                           picojson::object& out);
+  void MediaControllerDisplayRotationInfoRemoveChangeListener(const picojson::value& args,
+                                                              picojson::object& out);
 
   std::shared_ptr<MediaControllerClient> client_;
   std::shared_ptr<MediaControllerServer> server_;
index 989c92be76ca83604c8159aed972176a7a7ef205..353a50935e031793dd25c908e20e6f1d709a1995 100644 (file)
@@ -73,6 +73,11 @@ MediaControllerServer::~MediaControllerServer() {
     LoggerE("Failed to unset display mode request listener");
   }
 
+  if (nullptr != display_rotation_change_request_listener_ &&
+      !UnsetDisplayRotationChangeRequestListener()) {
+    LoggerE("Failed to unset display rotation listener");
+  }
+
   for (auto const& v : playlist_handle_map_) {
     if (MEDIA_CONTROLLER_ERROR_NONE != mc_playlist_destroy(v.second)) {
       LoggerE("Unable to destroy playlist %s", v.first.c_str());
@@ -1256,7 +1261,85 @@ PlatformResult MediaControllerServer::UnsetDisplayModeChangeRequestListener() {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-// TODO displayRotation
+// displayRotation
+PlatformResult MediaControllerServer::UpdateDisplayRotation(const std::string& display_rotation) {
+  ScopeLogger();
+  mc_display_rotation_e rotation = MC_DISPLAY_ROTATION_NONE;
+  PlatformResult result =
+      types::MediaControllerDisplayRotationEnum.getValue(display_rotation, &rotation);
+  if (!result) {
+    LoggerE("MediaControllerDisplayRotationEnum.getValue() failed, error: %s",
+            result.message().c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR);
+  }
+
+  int ret = mc_server_update_display_rotation(handle_, rotation);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error setting server display rotation",
+                              ("mc_server_update_display_rotation() error: %d, message: %s", ret,
+                               get_error_message(ret)));
+  }
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void MediaControllerServer::OnDisplayRotationChangeCommand(const char* client_name,
+                                                           const char* request_id,
+                                                           mc_display_rotation_e rotation,
+                                                           void* user_data) {
+  ScopeLogger();
+
+  MediaControllerServer* server = static_cast<MediaControllerServer*>(user_data);
+
+  std::string display_rotation;
+  PlatformResult result =
+      types::MediaControllerDisplayRotationEnum.getName(rotation, &display_rotation);
+  if (!result) {
+    LoggerW("MediaControllerDisplayRotationEnum.getName() failed, error: %s, ignoring event",
+            result.message().c_str());
+    return;
+  }
+
+  picojson::value data = picojson::value(picojson::object());
+  picojson::object& data_o = data.get<picojson::object>();
+
+  data_o["displayRotation"] = picojson::value(display_rotation);
+  data_o["clientName"] = picojson::value(client_name);
+  data_o["requestId"] = picojson::value(std::string(request_id));
+  server->display_rotation_change_request_listener_(&data);
+}
+
+PlatformResult MediaControllerServer::SetDisplayRotationChangeRequestListener(
+    const JsonCallback& callback) {
+  ScopeLogger();
+
+  int ret =
+      mc_server_set_display_rotation_cmd_received_cb(handle_, OnDisplayRotationChangeCommand, this);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::UNKNOWN_ERR, "Unable to set display rotation command listener",
+        ("mc_server_set_display_rotation_cmd_received_cb() error: %d, message: %s", ret,
+         get_error_message(ret)));
+  }
+
+  display_rotation_change_request_listener_ = callback;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerServer::UnsetDisplayRotationChangeRequestListener() {
+  ScopeLogger();
+
+  int ret = mc_server_unset_display_rotation_cmd_received_cb(handle_);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::UNKNOWN_ERR, "Unable to unset display rotation command listener",
+        ("mc_server_unset_display_rotation_cmd_received_cb() error: %d, message: %s", ret,
+         get_error_message(ret)));
+  }
+  display_rotation_change_request_listener_ = nullptr;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
 
 }  // namespace mediacontroller
 }  // namespace extension
index 262640b3f38e0dbe0dd79c2df54854e7b4d7fef1..3c84c1244fa61bcc3906bea3e8593a6497dbf857 100644 (file)
@@ -84,7 +84,11 @@ class MediaControllerServer {
   common::PlatformResult SetDisplayModeChangeRequestListener(const JsonCallback& callback);
   common::PlatformResult UnsetDisplayModeChangeRequestListener();
 
-  // TODO displayRotation
+  // displayRotation
+  common::PlatformResult UpdateDisplayRotation(const std::string& display_rotation);
+  common::PlatformResult SetDisplayRotationChangeRequestListener(const JsonCallback& callback);
+  common::PlatformResult UnsetDisplayRotationChangeRequestListener();
+
  private:
   mc_server_h handle_;
 
@@ -134,7 +138,10 @@ class MediaControllerServer {
   static void OnDisplayModeChangeCommand(const char* client_name, const char* request_id,
                                          mc_display_mode_e type, void* user_data);
 
-  // TODO displayRotation
+  // displayRotation
+  JsonCallback display_rotation_change_request_listener_;
+  static void OnDisplayRotationChangeCommand(const char* client_name, const char* request_id,
+                                             mc_display_rotation_e type, void* user_data);
 };
 
 }  // namespace mediacontroller
index a4908744820ff9580e2a7183f873f65851222179..784149180265bc52b0e38cfd48e6129bcc3c4cbe 100644 (file)
@@ -120,6 +120,12 @@ const common::PlatformEnum<mc_display_mode_e> MediaControllerDisplayModeEnum{
     {"FULL_SCREEN", MC_DISPLAY_MODE_FULL_SCREEN},
     {"CROPPED_FULL", MC_DISPLAY_MODE_CROPPED_FULL}};
 
+const common::PlatformEnum<mc_display_rotation_e> MediaControllerDisplayRotationEnum{
+    {"ROTATION_NONE", MC_DISPLAY_ROTATION_NONE},
+    {"ROTATION_90", MC_DISPLAY_ROTATION_90},
+    {"ROTATION_180", MC_DISPLAY_ROTATION_180},
+    {"ROTATION_270", MC_DISPLAY_ROTATION_270}};
+
 PlatformResult ConvertPlaybackState(mc_playback_h playback_h, std::string* state) {
   ScopeLogger();
 
index 8540e7276cf6af895725c3d2d2e6d874580ffb16..2338982eb3cf33fb2e51a2e2fc3ec27a3fa62779 100644 (file)
@@ -52,6 +52,7 @@ extern const common::PlatformEnum<mc_ability_support_e> MediaControllerAbilitySu
 extern const common::PlatformEnum<mc_subscription_type_e> MediaControllerSubscriptionTypeEnum;
 extern const common::PlatformEnum<mc_ability_e> MediaControllerSimpleAbilityEnum;
 extern const common::PlatformEnum<mc_display_mode_e> MediaControllerDisplayModeEnum;
+extern const common::PlatformEnum<mc_display_rotation_e> MediaControllerDisplayRotationEnum;
 
 }  // namespace types