Home | History | Annotate | Download | only in login
      1 // Copyright (c) 2010 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/update_view.h"
      6 
      7 #include <string>
      8 
      9 #include "base/utf_string_conversions.h"
     10 #include "chrome/browser/chromeos/login/helper.h"
     11 #include "chrome/browser/chromeos/login/rounded_rect_painter.h"
     12 #include "chrome/browser/chromeos/login/update_screen.h"
     13 #include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
     14 #include "grit/chromium_strings.h"
     15 #include "grit/generated_resources.h"
     16 #include "ui/base/l10n/l10n_util.h"
     17 #include "ui/base/resource/resource_bundle.h"
     18 #include "views/border.h"
     19 #include "views/controls/label.h"
     20 #include "views/controls/progress_bar.h"
     21 #include "views/controls/throbber.h"
     22 #include "views/focus/focus_manager.h"
     23 #include "views/widget/widget.h"
     24 
     25 using views::Background;
     26 using views::Label;
     27 using views::View;
     28 using views::Widget;
     29 
     30 namespace {
     31 
     32 // TODO(nkostylev): Switch to GridLayout.
     33 
     34 // Y offset for the 'installing updates' label.
     35 const int kInstallingUpdatesLabelYBottomFromProgressBar = 18;
     36 // Y offset for the progress bar.
     37 const int kProgressBarY = 130;
     38 // Y offset for the 'computer will restart' label.
     39 const int kRebootLabelYFromProgressBar = 55;
     40 // Y offset for the 'ESCAPE to skip' label.
     41 const int kEscapeToSkipLabelY = 48;
     42 // Progress bar width.
     43 const int kProgressBarWidth = 420;
     44 // Progress bar height.
     45 const int kProgressBarHeight = 18;
     46 // Horizontal spacing (ex. min left and right margins for label on the screen).
     47 const int kHorizontalSpacing = 65;
     48 // Horizontal spacing between spinner and label on the curtain screen.
     49 const int kBetweenSpacing = 25;
     50 
     51 // Label color.
     52 const SkColor kLabelColor = 0xFF000000;
     53 const SkColor kSkipLabelColor = 0xFFAA0000;
     54 const SkColor kManualRebootLabelColor = 0xFFAA0000;
     55 
     56 }  // namespace
     57 
     58 namespace chromeos {
     59 
     60 UpdateView::UpdateView(chromeos::ScreenObserver* observer)
     61     : installing_updates_label_(NULL),
     62       preparing_updates_label_(NULL),
     63       reboot_label_(NULL),
     64       manual_reboot_label_(NULL),
     65       progress_bar_(NULL),
     66       show_curtain_(true),
     67       show_manual_reboot_label_(false),
     68       show_preparing_updates_label_(false),
     69       observer_(observer) {
     70 }
     71 
     72 UpdateView::~UpdateView() {
     73 }
     74 
     75 void UpdateView::Init() {
     76   // Use rounded-rect background.
     77   views::Painter* painter = chromeos::CreateWizardPainter(
     78       &chromeos::BorderDefinition::kScreenBorder);
     79   set_background(views::Background::CreateBackgroundPainter(true, painter));
     80 
     81   InitLabel(&installing_updates_label_);
     82   InitLabel(&preparing_updates_label_);
     83   InitLabel(&reboot_label_);
     84   InitLabel(&manual_reboot_label_);
     85   preparing_updates_label_->SetVisible(false);
     86   manual_reboot_label_->SetVisible(false);
     87   manual_reboot_label_->SetColor(kManualRebootLabelColor);
     88 
     89   progress_bar_ = new views::ProgressBar();
     90   AddChildView(progress_bar_);
     91 
     92   // Curtain view.
     93   InitLabel(&checking_label_);
     94   throbber_ = CreateDefaultThrobber();
     95   AddChildView(throbber_);
     96 
     97 #if !defined(OFFICIAL_BUILD)
     98   InitLabel(&escape_to_skip_label_);
     99   escape_to_skip_label_->SetColor(kSkipLabelColor);
    100   escape_to_skip_label_->SetText(
    101       L"Press ESCAPE to skip (Non-official builds only)");
    102 #endif
    103 
    104   UpdateLocalizedStrings();
    105   UpdateVisibility();
    106 }
    107 
    108 void UpdateView::Reset() {
    109   progress_bar_->SetProgress(0);
    110 }
    111 
    112 void UpdateView::UpdateLocalizedStrings() {
    113   installing_updates_label_->SetText(UTF16ToWide(l10n_util::GetStringFUTF16(
    114       IDS_INSTALLING_UPDATE,
    115       l10n_util::GetStringUTF16(IDS_PRODUCT_OS_NAME))));
    116   preparing_updates_label_->SetText(
    117       UTF16ToWide(l10n_util::GetStringUTF16(IDS_UPDATE_AVAILABLE)));
    118   reboot_label_->SetText(
    119       UTF16ToWide(l10n_util::GetStringUTF16(IDS_INSTALLING_UPDATE_DESC)));
    120   manual_reboot_label_->SetText(
    121       UTF16ToWide(l10n_util::GetStringUTF16(IDS_UPDATE_COMPLETED)));
    122   checking_label_->SetText(
    123       UTF16ToWide(l10n_util::GetStringUTF16(IDS_CHECKING_FOR_UPDATES)));
    124 }
    125 
    126 void UpdateView::AddProgress(int ticks) {
    127   progress_bar_->AddProgress(ticks);
    128 }
    129 
    130 void UpdateView::SetProgress(int progress) {
    131   progress_bar_->SetProgress(progress);
    132 }
    133 
    134 void UpdateView::ShowManualRebootInfo() {
    135   show_manual_reboot_label_ = true;
    136   UpdateVisibility();
    137 }
    138 
    139 void UpdateView::ShowPreparingUpdatesInfo(bool visible) {
    140   show_preparing_updates_label_ = visible;
    141   UpdateVisibility();
    142 }
    143 
    144 void UpdateView::ShowCurtain(bool show_curtain) {
    145   if (show_curtain_ != show_curtain) {
    146     show_curtain_ = show_curtain;
    147     UpdateVisibility();
    148   }
    149 }
    150 
    151 // Sets the bounds of the view, placing center of the view at the given
    152 // coordinates (|x| and |y|).
    153 static void setViewBounds(views::View* view, int x, int y) {
    154   int preferred_width = view->GetPreferredSize().width();
    155   int preferred_height = view->GetPreferredSize().height();
    156   view->SetBounds(
    157       x - preferred_width / 2,
    158       y - preferred_height / 2,
    159       preferred_width,
    160       preferred_height);
    161 }
    162 
    163 void UpdateView::Layout() {
    164   int max_width = width() - GetInsets().width() - 2 * kHorizontalSpacing;
    165   int right_margin = GetInsets().right() + kHorizontalSpacing;
    166   int max_height = height() - GetInsets().height();
    167   int vertical_center = GetInsets().top() + max_height / 2;
    168 
    169   installing_updates_label_->SizeToFit(max_width);
    170   preparing_updates_label_->SizeToFit(max_width);
    171   reboot_label_->SizeToFit(max_width);
    172   manual_reboot_label_->SizeToFit(max_width);
    173 
    174   progress_bar_->SetBounds(right_margin,
    175                            vertical_center - kProgressBarHeight / 2,
    176                            max_width,
    177                            kProgressBarHeight);
    178 
    179   installing_updates_label_->SetX(right_margin);
    180   installing_updates_label_->SetY(
    181       progress_bar_->y() -
    182       kInstallingUpdatesLabelYBottomFromProgressBar -
    183       installing_updates_label_->height());
    184   preparing_updates_label_->SetX(installing_updates_label_->x());
    185   preparing_updates_label_->SetY(installing_updates_label_->y());
    186   reboot_label_->SetX(right_margin);
    187   reboot_label_->SetY(
    188       progress_bar_->y() +
    189       progress_bar_->height() +
    190       kRebootLabelYFromProgressBar);
    191   manual_reboot_label_->SetX(reboot_label_->x());
    192   manual_reboot_label_->SetY(reboot_label_->y());
    193   // Curtain layout is independed.
    194   int x_center = width() / 2;
    195   int throbber_width = throbber_->GetPreferredSize().width();
    196   checking_label_->SizeToFit(max_width - throbber_width - kBetweenSpacing);
    197   int checking_label_width = checking_label_->GetPreferredSize().width();
    198   int space_half = (kBetweenSpacing + 1) / 2;
    199   setViewBounds(
    200       throbber_, x_center - checking_label_width / 2 - space_half,
    201       vertical_center);
    202   setViewBounds(
    203       checking_label_, x_center + (throbber_width + 1) / 2 + space_half,
    204       vertical_center);
    205 #if !defined(OFFICIAL_BUILD)
    206   escape_to_skip_label_->SizeToFit(max_width);
    207   escape_to_skip_label_->SetX(right_margin);
    208   escape_to_skip_label_->SetY(kEscapeToSkipLabelY);
    209 #endif
    210   SchedulePaint();
    211 }
    212 
    213 void UpdateView::InitLabel(views::Label** label) {
    214   *label = new views::Label();
    215   (*label)->SetColor(kLabelColor);
    216   (*label)->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
    217   (*label)->SetMultiLine(true);
    218 
    219   ResourceBundle& res_bundle = ResourceBundle::GetSharedInstance();
    220   gfx::Font label_font = res_bundle.GetFont(ResourceBundle::MediumFont);
    221   (*label)->SetFont(label_font);
    222 
    223   AddChildView(*label);
    224 }
    225 
    226 void UpdateView::UpdateVisibility() {
    227   installing_updates_label_->SetVisible(!show_curtain_ &&
    228                                         !show_manual_reboot_label_ &&
    229                                         !show_preparing_updates_label_);
    230   preparing_updates_label_->SetVisible(!show_curtain_ &&
    231                                        !show_manual_reboot_label_ &&
    232                                        show_preparing_updates_label_);
    233   reboot_label_->SetVisible(!show_curtain_&& !show_manual_reboot_label_);
    234   manual_reboot_label_->SetVisible(!show_curtain_ && show_manual_reboot_label_);
    235   progress_bar_->SetVisible(!show_curtain_);
    236 
    237   checking_label_->SetVisible(show_curtain_);
    238   throbber_->SetVisible(show_curtain_);
    239   if (show_curtain_) {
    240     throbber_->Start();
    241   } else {
    242     throbber_->Stop();
    243   }
    244 }
    245 
    246 }  // namespace chromeos
    247