11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/ui/kiosk_external_update_notification.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ash/shell.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ash/shell_window_ids.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/window.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/resource/resource_bundle.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/compositor/layer.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/compositor/scoped_layer_animation_settings.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/canvas.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/label.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/layout/fill_layout.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/view.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/widget/widget.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/widget/widget_delegate.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromeos { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst SkColor kTextColor = SK_ColorBLACK; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst SkColor kWindowBackgroundColor = SK_ColorWHITE; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kWindowCornerRadius = 4; 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kPreferredWidth = 600; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kPreferredHeight = 250; 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass KioskExternalUpdateNotificationView : public views::WidgetDelegateView { 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit KioskExternalUpdateNotificationView( 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci KioskExternalUpdateNotification* owner) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : owner_(owner), widget_closed_(false) { 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AddLabel(); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetLayoutManager(new views::FillLayout); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~KioskExternalUpdateNotificationView() { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci widget_closed_ = true; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InformOwnerForDismiss(); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Closes the widget immediately from |owner_|. 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void CloseByOwner() { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci owner_ = NULL; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!widget_closed_) { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci widget_closed_ = true; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetWidget()->Close(); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetMessage(const base::string16& message) { label_->SetText(message); } 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // views::WidgetDelegateView overrides: 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkPaint paint; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paint.setStyle(SkPaint::kFill_Style); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paint.setColor(kWindowBackgroundColor); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci canvas->DrawRoundRect(GetLocalBounds(), kWindowCornerRadius, paint); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::WidgetDelegateView::OnPaint(canvas); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::Size GetPreferredSize() const OVERRIDE { 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return gfx::Size(kPreferredWidth, kPreferredHeight); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AddLabel() { 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label_ = new views::Label; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label_->SetFontList(rb.GetFontList(ui::ResourceBundle::BoldFont)); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label_->SetEnabledColor(kTextColor); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label_->SetDisabledColor(kTextColor); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label_->SetAutoColorReadabilityEnabled(false); 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci label_->SetMultiLine(true); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AddChildView(label_); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void InformOwnerForDismiss() { 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Inform the |owner_| that we are going away. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (owner_) { 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci KioskExternalUpdateNotification* owner = owner_; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci owner_ = NULL; 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci owner->Dismiss(); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The owner of this message which needs to get notified when the message 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // closes. 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci KioskExternalUpdateNotification* owner_; 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::Label* label_; // owned by views hierarchy. 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // True if the widget got already closed. 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool widget_closed_; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(KioskExternalUpdateNotificationView); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKioskExternalUpdateNotification::KioskExternalUpdateNotification( 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::string16& message) { 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndShowNotificationView(message); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKioskExternalUpdateNotification::~KioskExternalUpdateNotification() { 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Dismiss(); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskExternalUpdateNotification::ShowMessage( 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::string16& message) { 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (view_) 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_->SetMessage(message); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskExternalUpdateNotification::CreateAndShowNotificationView( 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::string16& message) { 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_ = new KioskExternalUpdateNotificationView(this); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_->SetMessage(message); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Window* root_window = ash::Shell::GetTargetRootWindow(); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Size rs = root_window->bounds().size(); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Size ps = view_->GetPreferredSize(); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect bounds((rs.width() - ps.width()) / 2, 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (rs.height() - ps.height()) / 10, 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps.width(), 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps.height()); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::Widget::InitParams params; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.type = views::Widget::InitParams::TYPE_POPUP; 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.ownership = views::Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET; 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.accept_events = false; 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.keep_on_top = true; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.remove_standard_frame = true; 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.delegate = view_; 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.bounds = bounds; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.parent = ash::Shell::GetContainer( 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_window, ash::kShellWindowId_SettingBubbleContainer); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::Widget* widget = new views::Widget; 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci widget->Init(params); 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci widget->SetContentsView(view_); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::NativeView native_view = widget->GetNativeView(); 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci native_view->SetName("KioskExternalUpdateNotification"); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci widget->Show(); 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskExternalUpdateNotification::Dismiss() { 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (view_) { 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci KioskExternalUpdateNotificationView* view = view_; 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_ = NULL; 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view->CloseByOwner(); 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace chromeos 158