1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/login/screens/eula_screen.h"
6
7#include "base/logging.h"
8#include "chrome/browser/browser_process.h"
9#include "chrome/browser/chromeos/customization_document.h"
10#include "chrome/browser/chromeos/login/screens/screen_observer.h"
11#include "chrome/browser/chromeos/login/wizard_controller.h"
12#include "chromeos/dbus/cryptohome_client.h"
13#include "chromeos/dbus/dbus_method_call_status.h"
14#include "chromeos/dbus/dbus_thread_manager.h"
15
16namespace chromeos {
17
18EulaScreen::EulaScreen(ScreenObserver* observer, EulaScreenActor* actor)
19    : WizardScreen(observer), actor_(actor), password_fetcher_(this) {
20  DCHECK(actor_);
21  if (actor_)
22    actor_->SetDelegate(this);
23}
24
25EulaScreen::~EulaScreen() {
26  if (actor_)
27    actor_->SetDelegate(NULL);
28}
29
30void EulaScreen::PrepareToShow() {
31  if (actor_)
32    actor_->PrepareToShow();
33}
34
35void EulaScreen::Show() {
36  // Command to own the TPM.
37  DBusThreadManager::Get()->GetCryptohomeClient()->TpmCanAttemptOwnership(
38      EmptyVoidDBusMethodCallback());
39  if (actor_)
40    actor_->Show();
41}
42
43void EulaScreen::Hide() {
44  if (actor_)
45    actor_->Hide();
46}
47
48std::string EulaScreen::GetName() const {
49  return WizardController::kEulaScreenName;
50}
51
52GURL EulaScreen::GetOemEulaUrl() const {
53  const StartupCustomizationDocument* customization =
54      StartupCustomizationDocument::GetInstance();
55  if (customization->IsReady()) {
56    // Previously we're using "initial locale" that device initially
57    // booted with out-of-box. http://crbug.com/145142
58    std::string locale = g_browser_process->GetApplicationLocale();
59    std::string eula_page = customization->GetEULAPage(locale);
60    if (!eula_page.empty())
61      return GURL(eula_page);
62
63    VLOG(1) << "No eula found for locale: " << locale;
64  } else {
65    LOG(ERROR) << "No manifest found.";
66  }
67  return GURL();
68}
69
70void EulaScreen::OnExit(bool accepted, bool usage_stats_enabled) {
71  get_screen_observer()->SetUsageStatisticsReporting(usage_stats_enabled);
72  get_screen_observer()->OnExit(accepted
73                   ? ScreenObserver::EULA_ACCEPTED
74                   : ScreenObserver::EULA_BACK);
75}
76
77void EulaScreen::InitiatePasswordFetch() {
78  if (tpm_password_.empty()) {
79    password_fetcher_.Fetch();
80    // Will call actor after password has been fetched.
81  } else if (actor_) {
82    actor_->OnPasswordFetched(tpm_password_);
83  }
84}
85
86void EulaScreen::OnPasswordFetched(const std::string& tpm_password) {
87  tpm_password_ = tpm_password;
88  if (actor_)
89    actor_->OnPasswordFetched(tpm_password_);
90}
91
92bool EulaScreen::IsUsageStatsEnabled() const {
93  return get_screen_observer()->GetUsageStatisticsReporting();
94}
95
96void EulaScreen::OnActorDestroyed(EulaScreenActor* actor) {
97  if (actor_ == actor)
98    actor_ = NULL;
99}
100
101}  // namespace chromeos
102