| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/views/overlay/playback_image_button.h" |
| |
| #include "chrome/app/vector_icons/vector_icons.h" |
| #include "chrome/browser/ui/color/chrome_color_id.h" |
| #include "chrome/browser/ui/views/overlay/constants.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/vector_icons/vector_icons.h" |
| #include "media/base/media_switches.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/metadata/metadata_impl_macros.h" |
| #include "ui/base/models/image_model.h" |
| #include "ui/color/color_id.h" |
| #include "ui/gfx/paint_vector_icon.h" |
| #include "ui/views/accessibility/view_accessibility.h" |
| #include "ui/views/animation/ink_drop.h" |
| #include "ui/views/background.h" |
| #include "ui/views/vector_icons.h" |
| |
| namespace { |
| |
| constexpr int kPlaybackButtonIconSize = 24; |
| |
| } // namespace |
| |
| PlaybackImageButton::PlaybackImageButton(PressedCallback callback) |
| : OverlayWindowImageButton(std::move(callback)) { |
| // For the 2024 updated UI, we're in charge of our own size, and the icons |
| // never change. |
| if (base::FeatureList::IsEnabled( |
| media::kVideoPictureInPictureControlsUpdate2024)) { |
| SetSize(gfx::Size(kCenterButtonSize, kCenterButtonSize)); |
| |
| // We use a solid background color in the 2024 updated UI, and that ends up |
| // sitting above the ink drop layer, so we need to force the ink drop layer |
| // higher here. |
| views::InkDrop::Get(this)->SetLayerRegion(views::LayerRegion::kAbove); |
| |
| play_image_ = ui::ImageModel::FromVectorIcon( |
| vector_icons::kPlayArrowIcon, ui::kColorSysOnSecondaryContainer, |
| kPlaybackButtonIconSize); |
| pause_image_ = ui::ImageModel::FromVectorIcon(vector_icons::kPauseIcon, |
| kColorPipWindowForeground, |
| kPlaybackButtonIconSize); |
| replay_image_ = ui::ImageModel::FromVectorIcon(vector_icons::kReplayIcon, |
| kColorPipWindowForeground, |
| kPlaybackButtonIconSize); |
| |
| UpdateImageAndText(); |
| } |
| |
| // Accessibility. |
| const std::u16string playback_accessible_button_label( |
| l10n_util::GetStringUTF16( |
| IDS_PICTURE_IN_PICTURE_PLAY_PAUSE_CONTROL_ACCESSIBLE_TEXT)); |
| GetViewAccessibility().SetName(playback_accessible_button_label); |
| } |
| |
| void PlaybackImageButton::OnBoundsChanged(const gfx::Rect& rect) { |
| if (base::FeatureList::IsEnabled( |
| media::kVideoPictureInPictureControlsUpdate2024)) { |
| return; |
| } |
| |
| int icon_size = std::max(0, width() - (2 * kPipWindowIconPadding)); |
| play_image_ = ui::ImageModel::FromVectorIcon( |
| vector_icons::kPlayArrowIcon, kColorPipWindowForeground, icon_size); |
| pause_image_ = ui::ImageModel::FromVectorIcon( |
| vector_icons::kPauseIcon, kColorPipWindowForeground, icon_size); |
| replay_image_ = ui::ImageModel::FromVectorIcon( |
| vector_icons::kReplayIcon, kColorPipWindowForeground, icon_size); |
| |
| UpdateImageAndText(); |
| } |
| |
| void PlaybackImageButton::SetPlaybackState( |
| const VideoOverlayWindowViews::PlaybackState playback_state) { |
| if (playback_state_ == playback_state) { |
| return; |
| } |
| |
| playback_state_ = playback_state; |
| UpdateImageAndText(); |
| } |
| |
| void PlaybackImageButton::UpdateImageAndText() { |
| switch (playback_state_) { |
| case VideoOverlayWindowViews::kPlaying: { |
| SetImageModel(views::Button::STATE_NORMAL, pause_image_); |
| SetPauseButtonBackground(); |
| std::u16string pause_text = |
| l10n_util::GetStringUTF16(IDS_PICTURE_IN_PICTURE_PAUSE_CONTROL_TEXT); |
| SetTooltipText(pause_text); |
| GetViewAccessibility().SetName(pause_text); |
| break; |
| } |
| case VideoOverlayWindowViews::kPaused: { |
| SetImageModel(views::Button::STATE_NORMAL, play_image_); |
| SetPlayButtonBackground(); |
| std::u16string play_text = |
| l10n_util::GetStringUTF16(IDS_PICTURE_IN_PICTURE_PLAY_CONTROL_TEXT); |
| SetTooltipText(play_text); |
| GetViewAccessibility().SetName(play_text); |
| break; |
| } |
| case VideoOverlayWindowViews::kEndOfVideo: { |
| SetImageModel(views::Button::STATE_NORMAL, replay_image_); |
| SetPauseButtonBackground(); |
| std::u16string replay_text = |
| l10n_util::GetStringUTF16(IDS_PICTURE_IN_PICTURE_REPLAY_CONTROL_TEXT); |
| SetTooltipText(replay_text); |
| GetViewAccessibility().SetName(replay_text); |
| break; |
| } |
| } |
| |
| SchedulePaint(); |
| } |
| |
| void PlaybackImageButton::SetPlayButtonBackground() { |
| if (!base::FeatureList::IsEnabled( |
| media::kVideoPictureInPictureControlsUpdate2024)) { |
| return; |
| } |
| SetBackground(views::CreateRoundedRectBackground( |
| ui::kColorSysSecondaryContainer, kCenterButtonSize / 2)); |
| } |
| |
| void PlaybackImageButton::SetPauseButtonBackground() { |
| if (!base::FeatureList::IsEnabled( |
| media::kVideoPictureInPictureControlsUpdate2024)) { |
| return; |
| } |
| |
| SetBackground(views::CreateRoundedRectBackground( |
| SkColorSetARGB(0x33, 0xFF, 0xFF, 0xFF), kCenterButtonSize / 2)); |
| } |
| |
| BEGIN_METADATA(PlaybackImageButton) |
| END_METADATA |