summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/generated_resources.grd6
-rw-r--r--chrome/browser/chromeos/login/existing_user_controller.cc4
-rw-r--r--chrome/browser/chromeos/login/network_screen.cc40
-rw-r--r--chrome/browser/chromeos/login/network_screen.h20
-rw-r--r--chrome/browser/chromeos/login/network_screen_delegate.h3
-rw-r--r--chrome/browser/chromeos/login/network_selection_view.cc93
-rw-r--r--chrome/browser/chromeos/login/network_selection_view.h10
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.