| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/macros.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_dialogs.h" |
| #include "chrome/browser/ui/network_profile_bubble.h" |
| #include "chrome/browser/ui/views/frame/browser_view.h" |
| #include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h" |
| #include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/grit/chromium_strings.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/strings/grit/components_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/views/bubble/bubble_dialog_delegate_view.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/controls/link.h" |
| #include "ui/views/controls/link_listener.h" |
| #include "ui/views/layout/fill_layout.h" |
| |
| namespace { |
| |
| // Bubble layout constants. |
| const int kNotificationBubbleWidth = 250; |
| |
| class NetworkProfileBubbleView : public views::BubbleDialogDelegateView, |
| public views::LinkListener { |
| public: |
| NetworkProfileBubbleView(views::View* anchor, |
| content::PageNavigator* navigator, |
| Profile* profile); |
| private: |
| ~NetworkProfileBubbleView() override; |
| |
| // views::BubbleDialogDelegateView: |
| void Init() override; |
| views::View* CreateExtraView() override; |
| int GetDialogButtons() const override; |
| bool Accept() override; |
| |
| // views::LinkListener: |
| void LinkClicked(views::Link* source, int event_flags) override; |
| |
| // Used for loading pages. |
| content::PageNavigator* navigator_; |
| Profile* profile_; |
| |
| DISALLOW_COPY_AND_ASSIGN(NetworkProfileBubbleView); |
| }; |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // NetworkProfileBubbleView, public: |
| |
| NetworkProfileBubbleView::NetworkProfileBubbleView( |
| views::View* anchor, |
| content::PageNavigator* navigator, |
| Profile* profile) |
| : BubbleDialogDelegateView(anchor, views::BubbleBorder::TOP_RIGHT), |
| navigator_(navigator), |
| profile_(profile) { |
| chrome::RecordDialogCreation( |
| chrome::DialogIdentifier::NETWORK_SHARE_PROFILE_WARNING); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // NetworkProfileBubbleView, private: |
| |
| NetworkProfileBubbleView::~NetworkProfileBubbleView() { |
| } |
| |
| void NetworkProfileBubbleView::Init() { |
| SetLayoutManager(std::make_unique<views::FillLayout>()); |
| views::Label* label = new views::Label( |
| l10n_util::GetStringFUTF16(IDS_PROFILE_ON_NETWORK_WARNING, |
| l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); |
| label->SetMultiLine(true); |
| label->SizeToFit(kNotificationBubbleWidth); |
| label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| AddChildView(label); |
| } |
| |
| views::View* NetworkProfileBubbleView::CreateExtraView() { |
| views::Link* learn_more = |
| new views::Link(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); |
| learn_more->set_listener(this); |
| return learn_more; |
| } |
| |
| int NetworkProfileBubbleView::GetDialogButtons() const { |
| return ui::DIALOG_BUTTON_OK; |
| } |
| |
| bool NetworkProfileBubbleView::Accept() { |
| NetworkProfileBubble::RecordUmaEvent( |
| NetworkProfileBubble::METRIC_ACKNOWLEDGED); |
| return true; |
| } |
| |
| void NetworkProfileBubbleView::LinkClicked(views::Link* source, |
| int event_flags) { |
| NetworkProfileBubble::RecordUmaEvent( |
| NetworkProfileBubble::METRIC_LEARN_MORE_CLICKED); |
| WindowOpenDisposition disposition = |
| ui::DispositionFromEventFlags(event_flags); |
| content::OpenURLParams params( |
| GURL("https://sites.google.com/a/chromium.org/dev/administrators/" |
| "common-problems-and-solutions#network_profile"), |
| content::Referrer(), disposition == WindowOpenDisposition::CURRENT_TAB |
| ? WindowOpenDisposition::NEW_FOREGROUND_TAB |
| : disposition, |
| ui::PAGE_TRANSITION_LINK, false); |
| navigator_->OpenURL(params); |
| |
| // If the user interacted with the bubble we don't reduce the number of |
| // warnings left. |
| PrefService* prefs = profile_->GetPrefs(); |
| int left_warnings = prefs->GetInteger(prefs::kNetworkProfileWarningsLeft); |
| prefs->SetInteger(prefs::kNetworkProfileWarningsLeft, ++left_warnings); |
| GetWidget()->Close(); |
| } |
| |
| } // namespace |
| |
| // static |
| void NetworkProfileBubble::ShowNotification(Browser* browser) { |
| views::View* anchor = NULL; |
| BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); |
| if (browser_view && browser_view->toolbar()) |
| anchor = browser_view->toolbar()->app_menu_button(); |
| NetworkProfileBubbleView* bubble = |
| new NetworkProfileBubbleView(anchor, browser, browser->profile()); |
| views::BubbleDialogDelegateView::CreateBubble(bubble)->Show(); |
| |
| NetworkProfileBubble::SetNotificationShown(true); |
| |
| // Mark the time of the last bubble and reduce the number of warnings left |
| // before the next silence period starts. |
| PrefService* prefs = browser->profile()->GetPrefs(); |
| prefs->SetInt64(prefs::kNetworkProfileLastWarningTime, |
| base::Time::Now().ToTimeT()); |
| int left_warnings = prefs->GetInteger(prefs::kNetworkProfileWarningsLeft); |
| if (left_warnings > 0) |
| prefs->SetInteger(prefs::kNetworkProfileWarningsLeft, --left_warnings); |
| } |