diff options
-rw-r--r-- | chrome/app/generated_resources.grd | 6 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/existing_user_controller.cc | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/network_screen.cc | 40 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/network_screen.h | 20 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/network_screen_delegate.h | 3 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/network_selection_view.cc | 93 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/network_selection_view.h | 10 |
7 files changed, 153 insertions, 23 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 09b5acdb..92d4cef 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -8259,6 +8259,12 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_NETWORK_SELECTION_CONTINUE_BUTTON" desc="Text shown on continue button"> Continue ยป </message> + <message name="IDS_NETWORK_SELECTION_ERROR" desc="Error shown when connection to network failed or timed out."> + <ph name="PRODUCT_NAME">$1<ex>Chrome OS</ex></ph> was unable to connect to <ph name="NETWORK_ID">$2<ex>Public Wifi</ex></ph>. Please select another network or try again. + </message> + <message name="IDS_NETWORK_SELECTION_ERROR_HELP" desc="Help link that is shown when connection to network failed or timed out."> + Fix network issues + </message> <message name="IDS_LOGIN_TITLE"> Sign in with your Google account </message> diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc index 2b20733..708aa27 100644 --- a/chrome/browser/chromeos/login/existing_user_controller.cc +++ b/chrome/browser/chromeos/login/existing_user_controller.cc @@ -460,6 +460,10 @@ void ExistingUserController::OnHelpLinkActivated() { help_app_->ShowHelpTopic( HelpAppLauncher::HELP_CANT_ACCESS_ACCOUNT_OFFLINE); break; + case(GoogleServiceAuthError::ACCOUNT_DISABLED): + help_app_->ShowHelpTopic( + HelpAppLauncher::HELP_ACCOUNT_DISABLED); + break; default: help_app_->ShowHelpTopic(login_timed_out_ ? HelpAppLauncher::HELP_CANT_ACCESS_ACCOUNT_OFFLINE : diff --git a/chrome/browser/chromeos/login/network_screen.cc b/chrome/browser/chromeos/login/network_screen.cc index d63bbe2..19f13a6 100644 --- a/chrome/browser/chromeos/login/network_screen.cc +++ b/chrome/browser/chromeos/login/network_screen.cc @@ -5,13 +5,17 @@ #include "chrome/browser/chromeos/login/network_screen.h" #include "app/l10n_util.h" +#include "app/resource_bundle.h" #include "base/string16.h" #include "base/utf_string_conversions.h" #include "base/logging.h" #include "chrome/browser/chromeos/cros/cros_library.h" +#include "chrome/browser/chromeos/login/help_app_launcher.h" #include "chrome/browser/chromeos/login/network_selection_view.h" #include "chrome/browser/chromeos/login/screen_observer.h" +#include "grit/chromium_strings.h" #include "grit/generated_resources.h" +#include "grit/theme_resources.h" #include "views/widget/widget.h" #include "views/window/window.h" @@ -37,7 +41,8 @@ NetworkScreen::NetworkScreen(WizardScreenDelegate* delegate) kWelcomeScreenWidth, kWelcomeScreenHeight), is_network_subscribed_(false), - continue_pressed_(false) { + continue_pressed_(false), + bubble_(NULL) { } NetworkScreen::~NetworkScreen() { @@ -45,11 +50,21 @@ NetworkScreen::~NetworkScreen() { UnsubscribeNetworkNotification(); } +//////////////////////////////////////////////////////////////////////////////// +// NetworkScreen, NetworkScreenDelegate implementation: + +void NetworkScreen::ClearErrors() { + // bubble_ will be set to NULL in callback. + if (bubble_) + bubble_->Close(); +} + /////////////////////////////////////////////////////////////////////////////// // views::ButtonListener implementation: void NetworkScreen::ButtonPressed(views::Button* sender, const views::Event& event) { + ClearErrors(); NetworkLibrary* network = CrosLibrary::Get()->GetNetworkLibrary(); if (network && network->Connected()) { NotifyOnConnection(); @@ -78,6 +93,15 @@ NetworkSelectionView* NetworkScreen::AllocateView() { return new NetworkSelectionView(this); } +/////////////////////////////////////////////////////////////////////////////// +// NetworkScreen, views::InfoBubbleDelegate implementation: + +void NetworkScreen::OnHelpLinkActivated() { + if (!help_app_.get()) + help_app_.reset(new HelpAppLauncher(view()->GetNativeWindow())); + help_app_->ShowHelpTopic(HelpAppLauncher::HELP_CONNECTIVITY); +} + //////////////////////////////////////////////////////////////////////////////// // NetworkScreen, public: @@ -113,8 +137,20 @@ void NetworkScreen::NotifyOnConnection() { } void NetworkScreen::OnConnectionTimeout() { - // TODO(nkostylev): Notify on connection error. StopWaitingForConnection(network_id_); + // Show error bubble. + ClearErrors(); + views::View* network_control = view()->GetNetworkControlView(); + bubble_ = MessageBubble::Show( + network_control->GetWidget(), + network_control->GetScreenBounds(), + BubbleBorder::LEFT_TOP, + ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_WARNING), + l10n_util::GetStringF(IDS_NETWORK_SELECTION_ERROR, + l10n_util::GetString(IDS_PRODUCT_OS_NAME), + UTF16ToWide(network_id_)), + l10n_util::GetString(IDS_NETWORK_SELECTION_ERROR_HELP), + this); } void NetworkScreen::UpdateStatus(NetworkLibrary* network) { diff --git a/chrome/browser/chromeos/login/network_screen.h b/chrome/browser/chromeos/login/network_screen.h index 3639273..3f22c21 100644 --- a/chrome/browser/chromeos/login/network_screen.h +++ b/chrome/browser/chromeos/login/network_screen.h @@ -8,10 +8,12 @@ #include "base/task.h" #include "base/timer.h" +#include "base/scoped_ptr.h" #include "base/string16.h" #include "chrome/browser/chromeos/cros/network_library.h" #include "chrome/browser/chromeos/login/network_screen_delegate.h" #include "chrome/browser/chromeos/login/language_switch_menu.h" +#include "chrome/browser/chromeos/login/message_bubble.h" #include "chrome/browser/chromeos/login/view_screen.h" #include "chrome/browser/chromeos/network_list.h" #include "chrome/browser/chromeos/options/network_config_view.h" @@ -20,15 +22,19 @@ class WizardScreenDelegate; namespace chromeos { +class HelpAppLauncher; class NetworkSelectionView; class NetworkScreen : public ViewScreen<NetworkSelectionView>, + public MessageBubbleDelegate, public NetworkScreenDelegate { public: explicit NetworkScreen(WizardScreenDelegate* delegate); virtual ~NetworkScreen(); // NetworkScreenDelegate implementation: + virtual void ClearErrors(); + virtual LanguageSwitchMenu* language_switch_menu() { return &language_switch_menu_; } @@ -49,6 +55,13 @@ class NetworkScreen : public ViewScreen<NetworkSelectionView>, virtual void CreateView(); virtual NetworkSelectionView* AllocateView(); + // Overridden from views::InfoBubbleDelegate. + virtual void InfoBubbleClosing(InfoBubble* info_bubble, + bool closed_by_escape) { bubble_ = NULL; } + virtual bool CloseOnEscape() { return true; } + virtual bool FadeInOnShow() { return false; } + virtual void OnHelpLinkActivated(); + // Subscribes to network change notifications. void SubscribeNetworkNotification(); @@ -85,6 +98,13 @@ class NetworkScreen : public ViewScreen<NetworkSelectionView>, LanguageSwitchMenu language_switch_menu_; + // Pointer to shown message bubble. We don't need to delete it because + // it will be deleted on bubble closing. + MessageBubble* bubble_; + + // Help application used for help dialogs. + scoped_ptr<HelpAppLauncher> help_app_; + DISALLOW_COPY_AND_ASSIGN(NetworkScreen); }; diff --git a/chrome/browser/chromeos/login/network_screen_delegate.h b/chrome/browser/chromeos/login/network_screen_delegate.h index 59824d3..5cfab23 100644 --- a/chrome/browser/chromeos/login/network_screen_delegate.h +++ b/chrome/browser/chromeos/login/network_screen_delegate.h @@ -19,6 +19,9 @@ class LanguageSwitchMenu; class NetworkScreenDelegate : public views::ButtonListener, public NetworkLibrary::Observer { public: + // Cleares all error notifications. + virtual void ClearErrors() = 0; + virtual LanguageSwitchMenu* language_switch_menu() = 0; protected: diff --git a/chrome/browser/chromeos/login/network_selection_view.cc b/chrome/browser/chromeos/login/network_selection_view.cc index 82262d7..fb8c8e11 100644 --- a/chrome/browser/chromeos/login/network_selection_view.cc +++ b/chrome/browser/chromeos/login/network_selection_view.cc @@ -11,6 +11,7 @@ #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/utf_string_conversions.h" +#include "chrome/browser/chromeos/login/helper.h" #include "chrome/browser/chromeos/login/language_switch_menu.h" #include "chrome/browser/chromeos/login/network_screen_delegate.h" #include "chrome/browser/chromeos/login/rounded_rect_painter.h" @@ -19,7 +20,6 @@ #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "views/controls/button/native_button.h" -#include "views/controls/combobox/combobox.h" #include "views/controls/label.h" #include "views/controls/throbber.h" #include "views/widget/widget.h" @@ -30,7 +30,6 @@ using views::Background; using views::Label; -using views::SmoothedThrobber; using views::View; using views::Widget; using views::WidgetGtk; @@ -60,13 +59,69 @@ const int kMenuWidthOffset = 6; const SkColor kWelcomeColor = 0xFF1D6AB1; -const int kThrobberFrameMs = 60; -const int kThrobberStartDelayMs = 500; - } // namespace namespace chromeos { +// NetworkDropdownButton with custom accelerator enabled. +class NetworkControlWithAccelerators : public NetworkDropdownButton { + public: + NetworkControlWithAccelerators(bool browser_mode, + gfx::NativeWindow parent_window, + NetworkScreenDelegate* delegate) + : NetworkDropdownButton(browser_mode, parent_window), + delegate_(delegate), + accel_clear_errors_(views::Accelerator(app::VKEY_ESCAPE, + false, false, false)) { + AddAccelerator(accel_clear_errors_); + } + + // Overridden from View: + bool AcceleratorPressed(const views::Accelerator& accel) { + if (accel == accel_clear_errors_) { + delegate_->ClearErrors(); + return true; + } + return false; + } + + // Overridden from MenuButton: + virtual bool Activate() { + delegate_->ClearErrors(); + return MenuButton::Activate(); + } + + private: + NetworkScreenDelegate* delegate_; + + // ESC accelerator for closing error info bubble. + views::Accelerator accel_clear_errors_; + + DISALLOW_COPY_AND_ASSIGN(NetworkControlWithAccelerators); +}; + +// MenuButton with custom processing on focus events. +class NotifyingMenuButton : public views::MenuButton { + public: + NotifyingMenuButton(views::ButtonListener* listener, + const std::wstring& text, + views::ViewMenuDelegate* menu_delegate, + bool show_menu_marker, + NetworkScreenDelegate* delegate) + : MenuButton(listener, text, menu_delegate, show_menu_marker), + delegate_(delegate) {} + + // Overridden from View: + virtual void DidGainFocus() { + delegate_->ClearErrors(); + } + + private: + NetworkScreenDelegate* delegate_; + + DISALLOW_COPY_AND_ASSIGN(NotifyingMenuButton); +}; + NetworkSelectionView::NetworkSelectionView(NetworkScreenDelegate* delegate) : languages_menubutton_(NULL), welcome_label_(NULL), @@ -75,7 +130,7 @@ NetworkSelectionView::NetworkSelectionView(NetworkScreenDelegate* delegate) connecting_network_label_(NULL), network_dropdown_(NULL), continue_button_(NULL), - throbber_(NULL), + throbber_(CreateDefaultSmoothedThrobber()), proxy_settings_link_(NULL), continue_button_order_index_(-1), continue_button_enabled_(false), @@ -113,20 +168,20 @@ void NetworkSelectionView::Init() { connecting_network_label_->SetFont(rb.GetFont(ResourceBundle::MediumFont)); connecting_network_label_->SetVisible(false); - throbber_ = new views::SmoothedThrobber(kThrobberFrameMs); - throbber_->SetFrames( - ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_SPINNER)); - throbber_->set_start_delay_ms(kThrobberStartDelayMs); - AddChildView(throbber_); - - languages_menubutton_ = new views::MenuButton( - NULL, std::wstring(), delegate_->language_switch_menu(), true); + languages_menubutton_ = new NotifyingMenuButton( + NULL, std::wstring(), delegate_->language_switch_menu(), true, delegate_); languages_menubutton_->SetFocusable(true); languages_menubutton_->SetNormalHasBorder(true); // Menu is positioned by bottom right corner of the MenuButton. delegate_->language_switch_menu()->set_menu_offset(kMenuHorizontalOffset, kMenuVerticalOffset); + network_dropdown_ = new NetworkControlWithAccelerators(false, + GetNativeWindow(), + delegate_); + network_dropdown_->SetNormalHasBorder(true); + network_dropdown_->SetFocusable(true); + proxy_settings_link_ = new views::Link(); proxy_settings_link_->SetController(this); proxy_settings_link_->SetVisible(false); @@ -136,10 +191,8 @@ void NetworkSelectionView::Init() { AddChildView(select_language_label_); AddChildView(select_network_label_); AddChildView(connecting_network_label_); + AddChildView(throbber_); AddChildView(languages_menubutton_); - network_dropdown_ = new NetworkDropdownButton(false, GetNativeWindow()); - network_dropdown_->SetNormalHasBorder(true); - network_dropdown_->SetFocusable(true); AddChildView(network_dropdown_); AddChildView(proxy_settings_link_); @@ -269,10 +322,14 @@ void NetworkSelectionView::Layout() { //////////////////////////////////////////////////////////////////////////////// // NetworkSelectionView, public: -gfx::NativeWindow NetworkSelectionView::GetNativeWindow() { +gfx::NativeWindow NetworkSelectionView::GetNativeWindow() const { return GTK_WINDOW(static_cast<WidgetGtk*>(GetWidget())->GetNativeView()); } +views::View* NetworkSelectionView::GetNetworkControlView() const { + return network_dropdown_; +} + void NetworkSelectionView::ShowConnectingStatus(bool connecting, const string16& network_id) { network_id_ = network_id; diff --git a/chrome/browser/chromeos/login/network_selection_view.h b/chrome/browser/chromeos/login/network_selection_view.h index 400821a..5fc00bf 100644 --- a/chrome/browser/chromeos/login/network_selection_view.h +++ b/chrome/browser/chromeos/login/network_selection_view.h @@ -19,7 +19,7 @@ namespace views { class Combobox; class Label; class NativeButton; -class SmoothedThrobber; +class Throbber; } // namespace views namespace chromeos { @@ -46,7 +46,11 @@ class NetworkSelectionView : public views::View, virtual gfx::Size GetPreferredSize(); virtual void Layout(); - gfx::NativeWindow GetNativeWindow(); + // Returns top level native window for the view. + gfx::NativeWindow GetNativeWindow() const; + + // Returns network control view. + views::View* GetNetworkControlView() const; // Shows network connecting status or network selection otherwise. void ShowConnectingStatus(bool connecting, const string16& network_id); @@ -81,7 +85,7 @@ class NetworkSelectionView : public views::View, views::Label* connecting_network_label_; NetworkDropdownButton* network_dropdown_; views::NativeButton* continue_button_; - views::SmoothedThrobber* throbber_; + views::Throbber* throbber_; views::Link* proxy_settings_link_; // Tab index of continue button. |