[Mediacontroller] added display mode feature 20/213720/9
authorPiotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/삼성전자 <p.kosko@samsung.com>
Thu, 12 Sep 2019 12:38:12 +0000 (14:38 +0200)
committerPiotr Kosko <p.kosko@samsung.com>
Thu, 19 Sep 2019 10:57:36 +0000 (10:57 +0000)
[ACR] http://suprem.sec.samsung.net/jira/browse/TWDAPI-231

[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(type, clientName)
{
    console.log("Display mode change requested to: " + type + " by " + clientName);
    return new tizen.mediacontroller.RequestReply(new tizen.Bundle({"message": "Not allowed"}), 13);
};
watcherId = mcServer.displayMode.addChangeRequestListener(changeListener);

/// 2. checking NotSupportedError when sending without enabled ability
var mcClient = tizen.mediacontroller.getClient();
var mcServerInfo = mcClient.getLatestServerInfo()
var type = "ORIGIN_SIZE";
mcServerInfo.displayMode.sendRequest(type,
    function(data, code)
    {
      console.log(
          "Server replied with return data: " + JSON.stringify(data) + " and code: " + code);
    },
    function(e)
    {
      console.log("Error executing command: " + e.message);
    });

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

/// 4. change the value of display mode (should trigger listener from point 3)
mcServer.displayMode.type = "FULL_SCREEN"

/// 4. enable ability of server
// TODO support: mcServer.abilities.displayMode.originSize = "YES"

/// sendRequest again (should trigger listener from point 1)
mcServerInfo.displayMode.sendRequest(type,
    function(data, code)
    {
      console.log(
          "Server replied with return data: " + JSON.stringify(data) + " and code: " + code);
    },
    function(e)
    {
      console.log("Error executing command: " + e.message);
    });

Change-Id: Icbc98513372d8da8e111a44d873c6559dede89e9

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 037b83fee62ff6cd858335fc358834565a184f97..3fbf321faf99f92a5d24e74c51cd603d71b7508f 100755 (executable)
@@ -362,6 +362,13 @@ var MediaControllerSimpleAbility = {
     MODE_360: 'MODE_360'
 };
 
+var MediaControllerDisplayModeType = {
+    LETTER_BOX: 'LETTER_BOX',
+    ORIGIN_SIZE: 'ORIGIN_SIZE',
+    FULL_SCREEN: 'FULL_SCREEN',
+    CROPPED_FULL: 'CROPPED_FULL'
+};
+
 function MediaControllerManager() {}
 
 MediaControllerManager.prototype.getClient = function() {
@@ -1405,9 +1412,208 @@ var MediaControllerMode360Info = function(name) {
     };
 };
 
-// TODO displayMode
-var MediaControllerDisplayMode = function() {};
-var MediaControllerDisplayModeInfo = function() {};
+// displayMode
+var MediaControllerDisplayMode = function() {
+    // the default value is MediaControllerDisplayModeType.FULL_SCREEN
+    var _type = MediaControllerDisplayModeType.FULL_SCREEN;
+    Object.defineProperties(this, {
+        type: {
+            get: function() {
+                return _type;
+            },
+            set: function(v) {
+                var args = validator_.validateArgs(arguments, [
+                    {
+                        name: 'type',
+                        type: types_.ENUM,
+                        values: Object.keys(MediaControllerDisplayModeType)
+                    }
+                ]);
+                if (args.type !== _type) {
+                    var result = native_.callSync(
+                        'MediaControllerDisplayMode_updateType',
+                        args
+                    );
+                    if (native_.isFailure(result)) {
+                        throw native_.getErrorObject(result);
+                    }
+                    _type = args.type;
+                }
+            },
+            enumerable: true
+        }
+    });
+};
+
+var MediaControllerDisplayModeListener = new ListenerManager(
+    native_,
+    '_MediaControllerDisplayModeListener',
+    function(msg, listener) {
+        var reply = listener(msg.clientName, msg.type);
+
+        if (!(reply instanceof RequestReply)) {
+            reply = new RequestReply(
+                xwalk.utils.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);
+        }
+    }
+);
+
+MediaControllerDisplayMode.prototype.addChangeRequestListener = function() {
+    var args = validator_.validateArgs(arguments, [
+        {
+            name: 'listener',
+            type: types_.FUNCTION,
+            optional: false,
+            nullable: false
+        }
+    ]);
+
+    if (type_.isEmptyObject(MediaControllerDisplayModeListener.listeners)) {
+        var result = native_.callSync(
+            'MediaControllerDisplayMode_addChangeRequestListener',
+            {
+                listenerId: MediaControllerDisplayModeListener.listenerName
+            }
+        );
+        if (native_.isFailure(result)) {
+            throw native_.getErrorObject(result);
+        }
+    }
+    return MediaControllerDisplayModeListener.addListener(args.listener);
+};
+
+MediaControllerDisplayMode.prototype.removeChangeRequestListener = function(watchId) {
+    var args = validator_.validateArgs(arguments, [
+        { name: 'watchId', type: types_.LONG }
+    ]);
+
+    MediaControllerDisplayModeListener.removeListener(args.watchId);
+
+    if (type_.isEmptyObject(MediaControllerDisplayModeListener.listeners)) {
+        var result = native_.callSync(
+            'MediaControllerDisplayMode_removeChangeRequestListener'
+        );
+        if (native_.isFailure(result)) {
+            throw native_.getErrorObject(result);
+        }
+    }
+};
+
+var DisplayModeChangeListener = new ListenerManager(
+    native_,
+    '_DisplayModeChangeListener',
+    function(msg, listener) {
+        listener(msg.displayMode);
+    }
+);
+
+var MediaControllerDisplayModeInfo = function(name) {
+    var _serverName = name;
+    Object.defineProperties(this, {
+        type: {
+            get: function() {
+                var result = native_.callSync('MediaControllerDisplayModeInfo_getType', {
+                    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: 'type',
+                type: types_.ENUM,
+                values: Object.keys(MediaControllerDisplayModeType)
+            },
+            {
+                name: 'replyCallback',
+                type: types_.FUNCTION
+            }
+        ]);
+        var callback = function(result) {
+            native_.callIfPossible(
+                args.replyCallback,
+                native_.getResultObject(result).data,
+                native_.getResultObject(result).code
+            );
+        };
+
+        var nativeData = {
+            type: args.type,
+            name: _serverName,
+            listenerId: ReplyCommandListener.listenerName
+        };
+
+        var result = native_.callSync(
+            'MediaControllerDisplayModeInfo_SendRequest',
+            nativeData
+        );
+        if (native_.isFailure(result)) {
+            throw native_.getErrorObject(result);
+        }
+
+        var replyListenerId = ReplyCommandListener.addListener(callback);
+        ReplyCommandListener.requestIdToListenerId[replyListenerId] = result.requestId;
+    };
+
+    this.addModeChangeListener = function(listener) {
+        var args = validator_.validateArgs(arguments, [
+            { name: 'listener', type: types_.FUNCTION }
+        ]);
+
+        if (type_.isEmptyObject(DisplayModeChangeListener.listeners)) {
+            var result = native_.callSync(
+                'MediaControllerDisplayModeInfo_addModeChangeListener',
+                {
+                    listenerId: DisplayModeChangeListener.listenerName
+                }
+            );
+            if (native_.isFailure(result)) {
+                throw native_.getErrorObject(result);
+            }
+        }
+        return DisplayModeChangeListener.addServerInfoListener(
+            args.listener,
+            _serverName
+        );
+    };
+    this.removeModeChangeListener = function(watchId) {
+        var args = validator_.validateArgs(arguments, [
+            { name: 'watchId', type: types_.LONG }
+        ]);
+
+        DisplayModeChangeListener.removeServerInfoListener(args.watchId);
+
+        if (type_.isEmptyObject(DisplayModeChangeListener.listeners)) {
+            var result = native_.callSync(
+                'MediaControllerDisplayModeInfo_removeModeChangeListener'
+            );
+            if (native_.isFailure(result)) {
+                throw native_.getErrorObject(result);
+            }
+        }
+    };
+};
+
 // TODO displayRotation
 var MediaControllerDisplayRotation = function() {};
 var MediaControllerDisplayRotationInfo = function() {};
@@ -2333,7 +2539,7 @@ function MediaControllerServerInfo(data) {
             writable: false
         },
         displayMode: {
-            value: new MediaControllerDisplayModeInfo(),
+            value: new MediaControllerDisplayModeInfo(data.name),
             enumerable: true,
             writable: false
         },
index 6bbade4dfe796e7adf6a9e3a18e435e9ec2f7434..2f3e7c5e7ce63d7df048eb641194ebb5729021cc 100644 (file)
@@ -71,6 +71,10 @@ MediaControllerClient::~MediaControllerClient() {
     LoggerE("Failed to unset mode 360 listener");
   }
 
+  if (nullptr != display_mode_update_listener_ && !UnsetDisplayModeInfoChangeListener()) {
+    LoggerE("Failed to unset display mode listener");
+  }
+
   if (nullptr != handle_ && MEDIA_CONTROLLER_ERROR_NONE != mc_client_destroy(handle_)) {
     LoggerE("Unable to destroy media controller client");
   }
@@ -1304,7 +1308,102 @@ void MediaControllerClient::OnMode360Update(const char* server_name, bool enable
 
   client->mode360_update_listener_(&data);
 }
-// TODO displayMode
+
+// displayMode
+PlatformResult MediaControllerClient::GetDisplayModeType(const std::string& name,
+                                                         std::string* type) {
+  ScopeLogger();
+  mc_display_mode_e mode = MC_DISPLAY_MODE_FULL_SCREEN;
+
+  int ret = mc_client_get_server_display_mode(handle_, name.c_str(), &mode);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Error getting display mode type",
+                              ("mc_client_get_server_display_mode() error: %d, message: %s", ret,
+                               get_error_message(ret)));
+  }
+
+  PlatformResult result = types::MediaControllerDisplayModeEnum.getName(mode, type);
+  if (!result) {
+    LoggerE("MediaControllerDisplayModeEnum.getName() failed, error: %s", result.message().c_str());
+    return result;
+  }
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerClient::SendDisplayModeType(const std::string& server_name,
+                                                          const std::string& type,
+                                                          const JsonCallback& reply_cb,
+                                                          char** request_id) {
+  ScopeLogger();
+  mc_display_mode_e mode = MC_DISPLAY_MODE_FULL_SCREEN;
+  PlatformResult result = types::MediaControllerDisplayModeEnum.getValue(type, &mode);
+  if (!result) {
+    LoggerE("MediaControllerDisplayModeEnum.getValue() failed, error: %s",
+            result.message().c_str());
+    return result;
+  }
+
+  int ret = mc_client_send_display_mode_cmd(handle_, server_name.c_str(), mode, request_id);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        utils::ConvertMediaControllerError(ret), "Error sending display mode command",
+        ("mc_client_send_display_mode_cmd() error: %d, message: %s", ret, get_error_message(ret)));
+  }
+
+  command_reply_callback_ = reply_cb;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerClient::SetDisplayModeInfoChangeListener(
+    const JsonCallback& callback) {
+  ScopeLogger();
+
+  int ret = mc_client_set_display_mode_updated_cb(handle_, OnDisplayModeUpdate, this);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to set display mode listener",
+                              ("mc_client_set_display_mode_updated_cb() error: %d, message: %s",
+                               ret, get_error_message(ret)));
+  }
+
+  display_mode_update_listener_ = callback;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerClient::UnsetDisplayModeInfoChangeListener() {
+  ScopeLogger();
+  int ret = mc_client_unset_display_mode_updated_cb(handle_);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unable to unset display mode listener",
+                              ("mc_client_unset_display_mode_updated_cb() error: %d, message: %s",
+                               ret, get_error_message(ret)));
+  }
+  display_mode_update_listener_ = nullptr;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void MediaControllerClient::OnDisplayModeUpdate(const char* server_name, mc_display_mode_e mode,
+                                                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 mode_str;
+  PlatformResult result = types::MediaControllerDisplayModeEnum.getName(mode, &mode_str);
+  if (!result) {
+    LoggerW("MediaControllerDisplayModeEnum.getName() failed, error: %s, ignoring event",
+            result.message().c_str());
+    return;
+  }
+
+  data_o["displayMode"] = picojson::value(mode_str);
+  data_o["name"] = picojson::value(server_name);
+
+  client->display_mode_update_listener_(&data);
+}
+
 // TODO displayRotation
 
 }  // namespace mediacontroller
index 1acf677aa229afade59576958cd022b95388ba7e..b3d245a80caf0e94d8d31603513427ddec0e2f7e 100644 (file)
@@ -85,7 +85,13 @@ class MediaControllerClient {
                                             const JsonCallback& reply_cb, char** request_id);
   common::PlatformResult SetMode360InfoChangeListener(const JsonCallback& callback);
   common::PlatformResult UnsetMode360InfoChangeListener();
-  // TODO displayMode
+  // displayMode
+  common::PlatformResult GetDisplayModeType(const std::string& name, std::string* type);
+  common::PlatformResult SendDisplayModeType(const std::string& server_name,
+                                             const std::string& type, const JsonCallback& reply_cb,
+                                             char** request_id);
+  common::PlatformResult SetDisplayModeInfoChangeListener(const JsonCallback& callback);
+  common::PlatformResult UnsetDisplayModeInfoChangeListener();
   // TODO displayRotation
 
  private:
@@ -100,6 +106,8 @@ class MediaControllerClient {
   JsonCallback subtitles_update_listener_;
   // mode 360
   JsonCallback mode360_update_listener_;
+  // display mode
+  JsonCallback display_mode_update_listener_;
 
   std::list<std::string> subscribed_servers;
 
@@ -123,7 +131,8 @@ class MediaControllerClient {
   static void OnSubtitlesUpdate(const char* server_name, bool enabled, void* user_data);
   // mode360
   static void OnMode360Update(const char* server_name, bool enabled, void* user_data);
-  // TODO displayMode
+  // displayMode
+  static void OnDisplayModeUpdate(const char* server_name, mc_display_mode_e mode, void* user_data);
   // TODO displayRotation
 };
 
index b959539d21598123e6bd12c26e3efadaeb401780..cc0a770d9ff6b49eceba7fdc463743ed90c88146 100644 (file)
@@ -180,7 +180,22 @@ MediaControllerInstance::MediaControllerInstance() {
                 MediaControllerMode360InfoAddModeChangeListener);
   REGISTER_SYNC("MediaControllerMode360Info_removeModeChangeListener",
                 MediaControllerMode360InfoRemoveModeChangeListener);
-// TODO displayMode
+
+  // displayMode
+  REGISTER_SYNC("MediaControllerDisplayMode_updateType", MediaControllerDisplayModeUpdateType);
+  REGISTER_SYNC("MediaControllerDisplayMode_addChangeRequestListener",
+                MediaControllerDisplayModeAddChangeRequestListener);
+  REGISTER_SYNC("MediaControllerDisplayMode_removeChangeRequestListener",
+                MediaControllerDisplayModeRemoveChangeRequestListener);
+
+  REGISTER_SYNC("MediaControllerDisplayModeInfo_getType", MediaControllerDisplayModeInfoGetType);
+  REGISTER_ASYNC("MediaControllerDisplayModeInfo_SendRequest",
+                 MediaControllerDisplayModeInfoSendType);
+  REGISTER_SYNC("MediaControllerDisplayModeInfo_addModeChangeListener",
+                MediaControllerDisplayModeInfoAddModeChangeListener);
+  REGISTER_SYNC("MediaControllerDisplayModeInfo_removeModeChangeListener",
+                MediaControllerDisplayModeInfoRemoveModeChangeListener);
+
 // TODO displayRotation
 
 #undef REGISTER_SYNC
@@ -1974,7 +1989,184 @@ void MediaControllerInstance::MediaControllerMode360InfoRemoveModeChangeListener
   ReportSuccess(out);
 }
 
-// TODO displayMode
+// displayMode
+void MediaControllerInstance::MediaControllerDisplayModeUpdateType(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, "type", std::string, out);
+
+  const std::string type = args.get("type").get<std::string>();
+  PlatformResult result = server_->UpdateDisplayModeType(type);
+  if (!result) {
+    LogAndReportError(result, &out, ("Failed server_->UpdateDisplayModeType()"));
+    return;
+  }
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayModeAddChangeRequestListener(
+    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_->SetDisplayModeChangeRequestListener(callback);
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayModeRemoveChangeRequestListener(
+    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_->UnsetDisplayModeChangeRequestListener();
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayModeInfoGetType(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 type;
+  PlatformResult result = client_->GetDisplayModeType(args.get("name").get<std::string>(), &type);
+
+  if (!result) {
+    LogAndReportError(result, &out, ("Failed: client_->GetDisplayModeType"));
+    return;
+  }
+
+  ReportSuccess(picojson::value(type), out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayModeInfoSendType(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, "type", std::string, out)
+
+  JsonCallback reply_cb = [this, args](picojson::value* reply) -> void {
+    picojson::object& reply_obj = reply->get<picojson::object>();
+    reply_obj["listenerId"] = args.get("listenerId");
+    Instance::PostMessage(this, reply->serialize().c_str());
+  };
+
+  char* request_id = nullptr;
+  SCOPE_EXIT {
+    free(request_id);
+  };
+
+  PlatformResult result =
+      client_->SendDisplayModeType(args.get("name").get<std::string>(),
+                                   args.get("type").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 command."));
+  }
+}
+
+void MediaControllerInstance::MediaControllerDisplayModeInfoAddModeChangeListener(
+    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_->SetDisplayModeInfoChangeListener(callback);
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
+void MediaControllerInstance::MediaControllerDisplayModeInfoRemoveModeChangeListener(
+    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_->UnsetDisplayModeInfoChangeListener();
+  if (!result) {
+    LogAndReportError(result, &out);
+    return;
+  }
+
+  ReportSuccess(out);
+}
+
 // TODO displayRotation
 
 #undef CHECK_EXIST
index b820825a7755e8fb3298da4b22e0ec7c97740212..bfd4105517c29f027cad3476c00fdd35294dc0f5 100644 (file)
@@ -145,7 +145,18 @@ class MediaControllerInstance : public common::ParsedInstance {
   void MediaControllerMode360InfoRemoveModeChangeListener(const picojson::value& args,
                                                           picojson::object& out);
 
-  // TODO displayMode
+  // displayMode
+  void MediaControllerDisplayModeUpdateType(const picojson::value& args, picojson::object& out);
+  void MediaControllerDisplayModeAddChangeRequestListener(const picojson::value& args,
+                                                          picojson::object& out);
+  void MediaControllerDisplayModeRemoveChangeRequestListener(const picojson::value& args,
+                                                             picojson::object& out);
+  void MediaControllerDisplayModeInfoGetType(const picojson::value& args, picojson::object& out);
+  void MediaControllerDisplayModeInfoSendType(const picojson::value& args, picojson::object& out);
+  void MediaControllerDisplayModeInfoAddModeChangeListener(const picojson::value& args,
+                                                           picojson::object& out);
+  void MediaControllerDisplayModeInfoRemoveModeChangeListener(const picojson::value& args,
+                                                              picojson::object& out);
   // TODO displayRotation
 
   std::shared_ptr<MediaControllerClient> client_;
index 5e2a532f22f238fa7d328f08fd812255f008eeba..989c92be76ca83604c8159aed972176a7a7ef205 100644 (file)
@@ -68,6 +68,11 @@ MediaControllerServer::~MediaControllerServer() {
     LoggerE("Failed to unset mode 360 request listener");
   }
 
+  if (nullptr != display_mode_change_request_listener_ &&
+      !UnsetDisplayModeChangeRequestListener()) {
+    LoggerE("Failed to unset display mode request 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());
@@ -1174,7 +1179,83 @@ PlatformResult MediaControllerServer::UnsetMode360ChangeRequestListener() {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-// TODO displayMode
+// displayMode
+common::PlatformResult MediaControllerServer::UpdateDisplayModeType(const std::string& type) {
+  ScopeLogger();
+  mc_display_mode_e mode = MC_DISPLAY_MODE_FULL_SCREEN;
+  PlatformResult result = types::MediaControllerDisplayModeEnum.getValue(type, &mode);
+  if (!result) {
+    LoggerE("MediaControllerDisplayModeEnum.getValue() failed, error: %s",
+            result.message().c_str());
+    return result;
+  }
+
+  int ret = mc_server_update_display_mode(handle_, mode);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::UNKNOWN_ERR, "Error setting server display mode",
+        ("mc_server_update_display_mode() error: %d, message: %s", ret, get_error_message(ret)));
+  }
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void MediaControllerServer::OnDisplayModeChangeCommand(const char* client_name,
+                                                       const char* request_id,
+                                                       mc_display_mode_e mode, void* user_data) {
+  ScopeLogger();
+
+  MediaControllerServer* server = static_cast<MediaControllerServer*>(user_data);
+
+  std::string type;
+  PlatformResult result = types::MediaControllerDisplayModeEnum.getName(mode, &type);
+  if (!result) {
+    LoggerW("MediaControllerDisplayModeEnum.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["type"] = picojson::value(type);
+  data_o["clientName"] = picojson::value(client_name);
+  data_o["requestId"] = picojson::value(std::string(request_id));
+
+  server->display_mode_change_request_listener_(&data);
+}
+
+PlatformResult MediaControllerServer::SetDisplayModeChangeRequestListener(
+    const JsonCallback& callback) {
+  ScopeLogger();
+
+  int ret = mc_server_set_display_mode_cmd_received_cb(handle_, OnDisplayModeChangeCommand, this);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::UNKNOWN_ERR, "Unable to set display mode command listener",
+        ("mc_server_set_display_mode_cmd_received_cb() error: %d, message: %s", ret,
+         get_error_message(ret)));
+  }
+
+  display_mode_change_request_listener_ = callback;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MediaControllerServer::UnsetDisplayModeChangeRequestListener() {
+  ScopeLogger();
+
+  int ret = mc_server_unset_display_mode_cmd_received_cb(handle_);
+  if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::UNKNOWN_ERR, "Unable to unset display mode command listener",
+        ("mc_server_unset_display_mode_cmd_received_cb() error: %d, message: %s", ret,
+         get_error_message(ret)));
+  }
+  display_mode_change_request_listener_ = nullptr;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
 // TODO displayRotation
 
 }  // namespace mediacontroller
index 6a401372ce93c9aa3cca090393170cf4202439e3..262640b3f38e0dbe0dd79c2df54854e7b4d7fef1 100644 (file)
@@ -78,7 +78,12 @@ class MediaControllerServer {
   common::PlatformResult UpdateMode360Enabled(bool enabled);
   common::PlatformResult SetMode360ChangeRequestListener(const JsonCallback& callback);
   common::PlatformResult UnsetMode360ChangeRequestListener();
-  // TODO displayMode
+
+  // displayMode
+  common::PlatformResult UpdateDisplayModeType(const std::string& type);
+  common::PlatformResult SetDisplayModeChangeRequestListener(const JsonCallback& callback);
+  common::PlatformResult UnsetDisplayModeChangeRequestListener();
+
   // TODO displayRotation
  private:
   mc_server_h handle_;
@@ -123,7 +128,12 @@ class MediaControllerServer {
   JsonCallback mode360_change_request_listener_;
   static void OnMode360ChangeCommand(const char* client_name, const char* request_id, bool enabled,
                                      void* user_data);
-  // TODO displayMode
+
+  // displayMode
+  JsonCallback display_mode_change_request_listener_;
+  static void OnDisplayModeChangeCommand(const char* client_name, const char* request_id,
+                                         mc_display_mode_e type, void* user_data);
+
   // TODO displayRotation
 };
 
index 6bd2af370e9d7c5672e34b7ada48c76b78a637ba..a4908744820ff9580e2a7183f873f65851222179 100644 (file)
@@ -114,6 +114,12 @@ const common::PlatformEnum<mc_ability_e> MediaControllerSimpleAbilityEnum{
     {"SUBTITLES", MC_ABILITY_SUBTITLES},
     {"MODE_360", MC_ABILITY_360_MODE}};
 
+const common::PlatformEnum<mc_display_mode_e> MediaControllerDisplayModeEnum{
+    {"LETTER_BOX", MC_DISPLAY_MODE_LETTER_BOX},
+    {"ORIGIN_SIZE", MC_DISPLAY_MODE_ORIGIN_SIZE},
+    {"FULL_SCREEN", MC_DISPLAY_MODE_FULL_SCREEN},
+    {"CROPPED_FULL", MC_DISPLAY_MODE_CROPPED_FULL}};
+
 PlatformResult ConvertPlaybackState(mc_playback_h playback_h, std::string* state) {
   ScopeLogger();
 
index cc570d57a67fb1ee61fe36a9bc050ffffb837e58..8540e7276cf6af895725c3d2d2e6d874580ffb16 100644 (file)
@@ -51,6 +51,7 @@ extern const common::PlatformEnum<mc_search_category_e> MediaControllerSearchCat
 extern const common::PlatformEnum<mc_ability_support_e> MediaControllerAbilitySupportEnum;
 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;
 
 }  // namespace types