// Copyright 2013 The Chromium 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 "remoting/host/continue_window.h"

#include "base/location.h"
#include "base/time/time.h"
#include "remoting/host/client_session_control.h"

// Minutes before the local user should confirm that the session should go on.
constexpr base::TimeDelta kSessionExpirationTimeout =
    base::TimeDelta::FromMinutes(30);

// Minutes before the session will be disconnected (from the moment the Continue
// window has been shown).
constexpr base::TimeDelta kSessionDisconnectTimeout =
    base::TimeDelta::FromMinutes(5);

namespace remoting {

ContinueWindow::ContinueWindow() = default;

ContinueWindow::~ContinueWindow() = default;

void ContinueWindow::Start(
    const base::WeakPtr<ClientSessionControl>& client_session_control) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  DCHECK(!client_session_control_);
  DCHECK(client_session_control);

  client_session_control_ = client_session_control;

  session_expired_timer_.Start(FROM_HERE, kSessionExpirationTimeout, this,
                               &ContinueWindow::OnSessionExpired);
}

void ContinueWindow::ContinueSession() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  disconnect_timer_.Stop();

  if (!client_session_control_)
    return;

  // Hide the Continue window and resume the session.
  HideUi();
  client_session_control_->SetDisableInputs(false);

  session_expired_timer_.Start(FROM_HERE, kSessionExpirationTimeout, this,
                               &ContinueWindow::OnSessionExpired);
}

void ContinueWindow::DisconnectSession() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  disconnect_timer_.Stop();
  if (client_session_control_)
    client_session_control_->DisconnectSession(protocol::MAX_SESSION_LENGTH);
}

void ContinueWindow::OnSessionExpired() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  if (!client_session_control_)
    return;

  // Stop the remote input while the Continue window is shown.
  client_session_control_->SetDisableInputs(true);

  // Show the Continue window and wait for the local user input.
  ShowUi();
  disconnect_timer_.Start(FROM_HERE, kSessionDisconnectTimeout, this,
                          &ContinueWindow::DisconnectSession);
}

}  // namespace remoting
