// 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 "remoting/host/client_session_control.h"

// Minutes before the local user should confirm that the session should go on.
const int kSessionExpirationTimeoutMinutes = 10;

// Minutes before the session will be disconnected (from the moment the Continue
// window has been shown).
const int kSessionDisconnectTimeoutMinutes = 1;

namespace remoting {

ContinueWindow::~ContinueWindow() = default;

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

  client_session_control_ = client_session_control;

  session_expired_timer_.Start(
      FROM_HERE, base::TimeDelta::FromMinutes(kSessionExpirationTimeoutMinutes),
      this, &ContinueWindow::OnSessionExpired);
}

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

  disconnect_timer_.Stop();

  if (!client_session_control_.get())
    return;

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

  session_expired_timer_.Start(
      FROM_HERE, base::TimeDelta::FromMinutes(kSessionExpirationTimeoutMinutes),
      this, &ContinueWindow::OnSessionExpired);
}

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

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

ContinueWindow::ContinueWindow() = default;

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

  if (!client_session_control_.get())
    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, base::TimeDelta::FromMinutes(kSessionDisconnectTimeoutMinutes),
      this, &ContinueWindow::DisconnectSession);
}

}  // namespace remoting
