// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/modular/lib/testing/session_shell_impl.h"

#include <lib/async/cpp/task.h>
#include <lib/async/default.h>

namespace modular_testing {

SessionShellImpl::SessionShellImpl() = default;
SessionShellImpl::~SessionShellImpl() = default;

fidl::InterfaceRequestHandler<fuchsia::modular::SessionShell> SessionShellImpl::GetHandler() {
  return bindings_.GetHandler(this);
}

// |SessionShell|
void SessionShellImpl::AttachView(fuchsia::modular::ViewIdentifier view_id,
                                  fuchsia::ui::views::ViewHolderToken /*view_holder_token*/) {
  on_attach_view_(std::move(view_id));
}

// |SessionShell|
void SessionShellImpl::AttachView2(fuchsia::modular::ViewIdentifier view_id,
                                   fuchsia::ui::views::ViewHolderToken view_holder_token) {
  AttachView(std::move(view_id), std::move(view_holder_token));
}

// |SessionShell|
void SessionShellImpl::DetachView(fuchsia::modular::ViewIdentifier view_id,
                                  fit::function<void()> done) {
  on_detach_view_(std::move(view_id));

  // Used to simulate a sluggish shell that hits the timeout.
  async::PostDelayedTask(async_get_default_dispatcher(), std::move(done), detach_delay_);
}

}  // namespace modular_testing
