Commit 045de9e5 authored by John Williams's avatar John Williams Committed by Commit Bot

Set status to "Stop casting" when user overs on stop icon.

Bug: 893311
Change-Id: I5479bf30aad7801234144b475ebed6f975760afc
Reviewed-on: https://chromium-review.googlesource.com/c/1281878Reviewed-by: default avatarmark a. foltz <mfoltz@chromium.org>
Reviewed-by: default avatarTakumi Fujimoto <takumif@chromium.org>
Commit-Queue: John Williams <jrw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#600565}
parent a05ca5ea
...@@ -222,6 +222,9 @@ ...@@ -222,6 +222,9 @@
<message name="IDS_MEDIA_ROUTER_SINK_CONNECTING" desc="Text shown as the status of a Cast destination that we are starting a Cast session on."> <message name="IDS_MEDIA_ROUTER_SINK_CONNECTING" desc="Text shown as the status of a Cast destination that we are starting a Cast session on.">
Connecting... Connecting...
</message> </message>
<message name="IDS_MEDIA_ROUTER_STOP_CASTING" desc="Text shown when user hovers over the stop icon for a cast device.">
Stop casting
</message>
<!-- Sink Search --> <!-- Sink Search -->
<message name="IDS_MEDIA_ROUTER_SEARCH_LABEL" desc="Label for search input in sink list."> <message name="IDS_MEDIA_ROUTER_SEARCH_LABEL" desc="Label for search input in sink list.">
......
...@@ -33,11 +33,12 @@ namespace { ...@@ -33,11 +33,12 @@ namespace {
class StopButton : public views::LabelButton { class StopButton : public views::LabelButton {
public: public:
StopButton(views::ButtonListener* button_listener, StopButton(CastDialogSinkButton* owner,
views::ButtonListener* button_listener,
const UIMediaSink& sink, const UIMediaSink& sink,
int button_tag, int button_tag,
bool enabled) bool enabled)
: views::LabelButton(button_listener, base::string16()) { : views::LabelButton(button_listener, base::string16()), owner_(owner) {
static const gfx::ImageSkia icon = CreateVectorIcon( static const gfx::ImageSkia icon = CreateVectorIcon(
kGenericStopIcon, kPrimaryIconSize, gfx::kGoogleBlue500); kGenericStopIcon, kPrimaryIconSize, gfx::kGoogleBlue500);
SetImage(views::Button::STATE_NORMAL, icon); SetImage(views::Button::STATE_NORMAL, icon);
...@@ -73,7 +74,19 @@ class StopButton : public views::LabelButton { ...@@ -73,7 +74,19 @@ class StopButton : public views::LabelButton {
bool CanProcessEventsWithinSubtree() const override { return true; } bool CanProcessEventsWithinSubtree() const override { return true; }
// views::Button:
void StateChanged(ButtonState old_state) override {
if (state() == Button::STATE_HOVERED) {
owner_->OverrideStatusText(
l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_STOP_CASTING));
} else if (old_state == Button::STATE_HOVERED) {
owner_->RestoreStatusText();
}
}
private: private:
CastDialogSinkButton* const owner_;
DISALLOW_COPY_AND_ASSIGN(StopButton); DISALLOW_COPY_AND_ASSIGN(StopButton);
}; };
...@@ -117,6 +130,7 @@ gfx::ImageSkia CreateDisabledSinkIcon(SinkIconType icon_type) { ...@@ -117,6 +130,7 @@ gfx::ImageSkia CreateDisabledSinkIcon(SinkIconType icon_type) {
} }
std::unique_ptr<views::View> CreatePrimaryIconForSink( std::unique_ptr<views::View> CreatePrimaryIconForSink(
CastDialogSinkButton* sink_button,
views::ButtonListener* button_listener, views::ButtonListener* button_listener,
const UIMediaSink& sink, const UIMediaSink& sink,
int button_tag) { int button_tag) {
...@@ -124,7 +138,7 @@ std::unique_ptr<views::View> CreatePrimaryIconForSink( ...@@ -124,7 +138,7 @@ std::unique_ptr<views::View> CreatePrimaryIconForSink(
if (sink.state == UIMediaSinkState::CONNECTED || if (sink.state == UIMediaSinkState::CONNECTED ||
sink.state == UIMediaSinkState::DISCONNECTING) { sink.state == UIMediaSinkState::DISCONNECTING) {
return std::make_unique<StopButton>( return std::make_unique<StopButton>(
button_listener, sink, button_tag, sink_button, button_listener, sink, button_tag,
sink.state == UIMediaSinkState::CONNECTED); sink.state == UIMediaSinkState::CONNECTED);
} else if (sink.issue) { } else if (sink.issue) {
auto icon_view = std::make_unique<views::ImageView>(); auto icon_view = std::make_unique<views::ImageView>();
...@@ -165,11 +179,12 @@ CastDialogSinkButton::CastDialogSinkButton( ...@@ -165,11 +179,12 @@ CastDialogSinkButton::CastDialogSinkButton(
views::ButtonListener* button_listener, views::ButtonListener* button_listener,
const UIMediaSink& sink, const UIMediaSink& sink,
int button_tag) int button_tag)
: HoverButton(button_listener, : HoverButton(
CreatePrimaryIconForSink(button_listener, sink, button_tag), button_listener,
sink.friendly_name, CreatePrimaryIconForSink(this, button_listener, sink, button_tag),
GetStatusTextForSink(sink), sink.friendly_name,
/** secondary_icon_view */ nullptr), GetStatusTextForSink(sink),
/** secondary_icon_view */ nullptr),
sink_(sink) { sink_(sink) {
set_tag(button_tag); set_tag(button_tag);
SetEnabled(sink.state == UIMediaSinkState::AVAILABLE); SetEnabled(sink.state == UIMediaSinkState::AVAILABLE);
...@@ -177,6 +192,21 @@ CastDialogSinkButton::CastDialogSinkButton( ...@@ -177,6 +192,21 @@ CastDialogSinkButton::CastDialogSinkButton(
CastDialogSinkButton::~CastDialogSinkButton() = default; CastDialogSinkButton::~CastDialogSinkButton() = default;
void CastDialogSinkButton::OverrideStatusText(
const base::string16& status_text) {
if (!saved_status_text_) {
saved_status_text_ = subtitle()->text();
}
subtitle()->SetText(status_text);
}
void CastDialogSinkButton::RestoreStatusText() {
if (saved_status_text_) {
subtitle()->SetText(*saved_status_text_);
saved_status_text_.reset();
}
}
bool CastDialogSinkButton::OnMousePressed(const ui::MouseEvent& event) { bool CastDialogSinkButton::OnMousePressed(const ui::MouseEvent& event) {
if (event.IsRightMouseButton()) if (event.IsRightMouseButton())
return true; return true;
......
...@@ -23,6 +23,9 @@ class CastDialogSinkButton : public HoverButton { ...@@ -23,6 +23,9 @@ class CastDialogSinkButton : public HoverButton {
int button_tag); int button_tag);
~CastDialogSinkButton() override; ~CastDialogSinkButton() override;
void OverrideStatusText(const base::string16& status_text);
void RestoreStatusText();
// views::View: // views::View:
bool OnMousePressed(const ui::MouseEvent& event) override; bool OnMousePressed(const ui::MouseEvent& event) override;
void OnMouseReleased(const ui::MouseEvent& event) override; void OnMouseReleased(const ui::MouseEvent& event) override;
...@@ -33,8 +36,10 @@ class CastDialogSinkButton : public HoverButton { ...@@ -33,8 +36,10 @@ class CastDialogSinkButton : public HoverButton {
private: private:
UIMediaSink sink_; UIMediaSink sink_;
base::Optional<base::string16> saved_status_text_;
DISALLOW_COPY_AND_ASSIGN(CastDialogSinkButton); DISALLOW_COPY_AND_ASSIGN(CastDialogSinkButton);
FRIEND_TEST_ALL_PREFIXES(CastDialogSinkButtonTest, OverrideStatusText);
}; };
} // namespace media_router } // namespace media_router
......
...@@ -57,4 +57,36 @@ TEST_F(CastDialogSinkButtonTest, SetStatusLabel) { ...@@ -57,4 +57,36 @@ TEST_F(CastDialogSinkButtonTest, SetStatusLabel) {
button4.subtitle()->text()); button4.subtitle()->text());
} }
TEST_F(CastDialogSinkButtonTest, OverrideStatusText) {
UIMediaSink sink;
CastDialogSinkButton button(nullptr, sink, 0);
base::string16 status0 = base::ASCIIToUTF16("status0");
base::string16 status1 = base::ASCIIToUTF16("status1");
base::string16 status2 = base::ASCIIToUTF16("status2");
// Calling RestoreStatusText does nothing when status has not been overridden.
button.subtitle()->SetText(status0);
ASSERT_EQ(button.subtitle()->text(), status0);
button.RestoreStatusText();
EXPECT_EQ(button.subtitle()->text(), status0);
// OverrideStatusText replaces status text.
button.OverrideStatusText(status1);
EXPECT_EQ(button.subtitle()->text(), status1);
// Additional calls to OverrideStatusText change the text.
button.OverrideStatusText(status2);
EXPECT_EQ(button.subtitle()->text(), status2);
// RestoreStatusText restores the saved status text.
button.RestoreStatusText();
EXPECT_EQ(button.subtitle()->text(), status0);
// Additional calls to RestoreStatusText don't change the text.
button.subtitle()->SetText(status1);
ASSERT_EQ(button.subtitle()->text(), status1);
button.RestoreStatusText();
EXPECT_EQ(button.subtitle()->text(), status1);
}
} // namespace media_router } // namespace media_router
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment