Chromium Code Reviews| Index: chrome/browser/ui/toolbar/media_router_action.cc |
| diff --git a/chrome/browser/ui/toolbar/media_router_action.cc b/chrome/browser/ui/toolbar/media_router_action.cc |
| index 97c60b2a4d4204916f94fb4734162b036ff85d49..53f8195143aec6dabc852ab654552d07dd306c83 100644 |
| --- a/chrome/browser/ui/toolbar/media_router_action.cc |
| +++ b/chrome/browser/ui/toolbar/media_router_action.cc |
| @@ -17,8 +17,13 @@ |
| #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h" |
| #include "chrome/browser/ui/toolbar/media_router_action_platform_delegate.h" |
| #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h" |
| +#include "chrome/browser/ui/toolbar/toolbar_actions_model.h" |
| #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h" |
| +#include "chrome/common/pref_names.h" |
| #include "chrome/grit/generated_resources.h" |
| +#include "components/prefs/pref_service.h" |
| +#include "components/prefs/pref_service_factory.h" |
| +#include "grit/theme_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/gfx/color_palette.h" |
| #include "ui/gfx/image/image_skia.h" |
| @@ -47,11 +52,13 @@ MediaRouterAction::MediaRouterAction(Browser* browser, |
| platform_delegate_(MediaRouterActionPlatformDelegate::Create(browser)), |
| contextual_menu_(browser), |
| tab_strip_model_observer_(this), |
| + toolbar_actions_bar_observer_(this), |
| weak_ptr_factory_(this) { |
| DCHECK(browser_); |
| DCHECK(toolbar_actions_bar_); |
| tab_strip_model_observer_.Add(browser_->tab_strip_model()); |
| - |
| + toolbar_actions_bar_observer_.Add(toolbar_actions_bar_); |
| + contextual_menu_.SetMediaRouterAction(weak_ptr_factory_.GetWeakPtr()); |
| RegisterObserver(); |
| } |
| @@ -113,7 +120,6 @@ bool MediaRouterAction::HasPopup( |
| void MediaRouterAction::HidePopup() { |
| GetMediaRouterDialogController()->HideMediaRouterDialog(); |
| - OnPopupHidden(); |
|
msw
2016/07/26 19:59:31
Why is this no longer called?
takumif
2016/07/28 20:04:10
MediaRouterDialogControllerImpl::OnDialogClosed al
|
| } |
| gfx::NativeView MediaRouterAction::GetPopupNativeView() { |
| @@ -160,12 +166,15 @@ void MediaRouterAction::OnIssueUpdated(const media_router::Issue* issue) { |
| void MediaRouterAction::OnRoutesUpdated( |
| const std::vector<media_router::MediaRoute>& routes, |
| const std::vector<media_router::MediaRoute::Id>& joinable_route_ids) { |
| + bool had_local_display_route = has_local_display_route_; |
| has_local_display_route_ = |
| std::find_if(routes.begin(), routes.end(), |
| [](const media_router::MediaRoute& route) { |
| return route.is_local() && route.for_display(); |
| }) != routes.end(); |
| MaybeUpdateIcon(); |
| + if (has_local_display_route_ != had_local_display_route) |
| + UpdateVisibility(); |
| } |
| void MediaRouterAction::ActiveTabChanged(content::WebContents* old_contents, |
| @@ -173,11 +182,59 @@ void MediaRouterAction::ActiveTabChanged(content::WebContents* old_contents, |
| int index, |
| int reason) { |
| UpdatePopupState(); |
| + UpdateVisibility(); |
| +} |
| + |
| +void MediaRouterAction::ToggleVisibilityPreference() { |
| + SetVisibilityPreference(!browser_->profile()->GetPrefs()-> |
|
msw
2016/07/26 19:59:31
optional nit: use the IsEphemeral (perhaps renamed
takumif
2016/07/28 20:04:10
Done.
|
| + GetBoolean(prefs::kMediaRouterAlwaysShowActionIcon)); |
| +} |
| + |
| +void MediaRouterAction::SetVisibilityPreference(bool always_show) { |
| + PrefService* pref_service = browser_->profile()->GetPrefs(); |
| + pref_service->SetBoolean(prefs::kMediaRouterAlwaysShowActionIcon, |
| + always_show); |
| + UpdateVisibility(); |
| +} |
| + |
| +void MediaRouterAction::UpdateVisibility() { |
| + if (!delegate_) |
| + return; |
| + |
| + MediaRouterDialogControllerImpl* controller = |
| + GetMediaRouterDialogController(); |
| + bool show_icon = !IsEphemeral() || |
| + controller->IsShowingMediaRouterDialog() || |
| + has_local_display_route_; |
| + ToolbarActionsModel* model = ToolbarActionsModel::Get(browser_->profile()); |
| + if (show_icon) { |
| + if (!model->HasComponentAction(GetId())) |
| + model->AddComponentAction(GetId()); |
| + } else { |
| + if (model->HasComponentAction(GetId())) |
|
Devlin
2016/07/26 21:59:02
isn't this the same as
else if (model->HasComponen
takumif
2016/07/28 20:04:10
Yes, it is. Corrected.
|
| + model->RemoveComponentAction(GetId()); |
| + } |
| } |
| void MediaRouterAction::OnPopupHidden() { |
| if (delegate_) |
| delegate_->OnPopupClosed(); |
| + ToolbarActionsModel* model = ToolbarActionsModel::Get(browser_->profile()); |
| + if (model->HasComponentAction(GetId()) && |
|
msw
2016/07/26 19:59:31
Shouldn't this also check IsShowingMediaRouterDial
takumif
2016/07/28 20:04:10
I could replace this with a call to MRAction::Upda
|
| + !has_local_display_route_ && |
| + IsEphemeral()) { |
| + model->RemoveComponentAction(GetId()); |
| + } |
| +} |
| + |
| +void MediaRouterAction::OnToolbarActionsBarAnimationEnded() { |
| + if (delegate_) { |
| + if (GetMediaRouterDialogController()->IsShowingMediaRouterDialog()) { |
|
msw
2016/07/26 19:59:31
nit: curlies not needed.
takumif
2016/07/28 20:04:10
Done.
|
| + delegate_->OnPopupShown(true); |
|
Devlin
2016/07/26 21:59:02
This behavior, or rather the motivation, isn't cle
takumif
2016/07/28 20:04:10
Done.
|
| + } else { |
| + delegate_->OnPopupClosed(); |
| + } |
| + } |
| } |
| void MediaRouterAction::OnPopupShown() { |
| @@ -203,11 +260,15 @@ void MediaRouterAction::UpdatePopupState() { |
| controller->SetMediaRouterAction(weak_ptr_factory_.GetWeakPtr()); |
| // Update the button in case the pressed state is out of sync with dialog |
| - // visibility. |
| - if (controller->IsShowingMediaRouterDialog()) |
| - OnPopupShown(); |
| - else |
| - OnPopupHidden(); |
| + // visibility. If we just added the ephemeral icon to the toolbar and need to |
| + // press it, we do that in |OnToolbarActionsBarAnimationEnded|. |
| + if (delegate_) { |
| + if (!IsEphemeral() && controller->IsShowingMediaRouterDialog()) { |
|
msw
2016/07/26 19:59:31
nit: curlies not needed.
takumif
2016/07/28 20:04:10
Done.
|
| + delegate_->OnPopupShown(true); |
| + } else if (!controller->IsShowingMediaRouterDialog()) { |
| + delegate_->OnPopupClosed(); |
| + } |
| + } |
| } |
| MediaRouterDialogControllerImpl* |
| @@ -216,7 +277,7 @@ MediaRouterAction::GetMediaRouterDialogController() { |
| content::WebContents* web_contents = delegate_->GetCurrentWebContents(); |
| DCHECK(web_contents); |
| return MediaRouterDialogControllerImpl::GetOrCreateForWebContents( |
| - web_contents); |
| + web_contents); |
|
Devlin
2016/07/26 21:59:02
indentation was right before.
takumif
2016/07/28 20:04:10
Done.
|
| } |
| MediaRouterActionPlatformDelegate* MediaRouterAction::GetPlatformDelegate() { |
| @@ -249,3 +310,12 @@ gfx::VectorIconId MediaRouterAction::GetCurrentIcon() const { |
| return has_local_display_route_ ? gfx::VectorIconId::MEDIA_ROUTER_ACTIVE |
| : gfx::VectorIconId::MEDIA_ROUTER_IDLE; |
| } |
| + |
| +base::WeakPtr<MediaRouterAction> MediaRouterAction::GetWeakPtr() { |
| + return weak_ptr_factory_.GetWeakPtr(); |
| +} |
| + |
| +bool MediaRouterAction::IsEphemeral() { |
| + PrefService* pref_service = browser_->profile()->GetPrefs(); |
| + return !pref_service->GetBoolean(prefs::kMediaRouterAlwaysShowActionIcon); |
| +} |