Commit dfd63ce6 authored by Jazz Xu's avatar Jazz Xu Committed by Commit Bot

GMC: Fix notification isn't visible when dragging out of Zenith dialog.

This CL fix the issue by creating a dragging widget when user start
dragging.

Bug: 1099387
Change-Id: Id0b1dab56216f7ec5614ae11580ce08ea208daf7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2267729
Commit-Queue: Jazz Xu <jazzhsu@chromium.org>
Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#783084}
parent 6049dbe2
...@@ -12,11 +12,13 @@ ...@@ -12,11 +12,13 @@
#include "components/vector_icons/vector_icons.h" #include "components/vector_icons/vector_icons.h"
#include "media/base/media_switches.h" #include "media/base/media_switches.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#include "ui/compositor/canvas_painter.h"
#include "ui/views/animation/ink_drop_mask.h" #include "ui/views/animation/ink_drop_mask.h"
#include "ui/views/animation/slide_out_controller.h" #include "ui/views/animation/slide_out_controller.h"
#include "ui/views/background.h" #include "ui/views/background.h"
#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/button/image_button_factory.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/layout/fill_layout.h" #include "ui/views/layout/fill_layout.h"
namespace { namespace {
...@@ -30,6 +32,7 @@ constexpr int kDismissButtonIconSize = 20; ...@@ -30,6 +32,7 @@ constexpr int kDismissButtonIconSize = 20;
constexpr int kDismissButtonBackgroundRadius = 15; constexpr int kDismissButtonBackgroundRadius = 15;
constexpr SkColor kDefaultForegroundColor = SK_ColorBLACK; constexpr SkColor kDefaultForegroundColor = SK_ColorBLACK;
constexpr SkColor kDefaultBackgroundColor = SK_ColorTRANSPARENT; constexpr SkColor kDefaultBackgroundColor = SK_ColorTRANSPARENT;
constexpr float kDragImageOpacity = 0.7f;
// The minimum number of enabled and visible user actions such that we should // The minimum number of enabled and visible user actions such that we should
// force the MediaNotificationView to be expanded. // force the MediaNotificationView to be expanded.
...@@ -115,6 +118,7 @@ MediaNotificationContainerImplView::MediaNotificationContainerImplView( ...@@ -115,6 +118,7 @@ MediaNotificationContainerImplView::MediaNotificationContainerImplView(
} }
MediaNotificationContainerImplView::~MediaNotificationContainerImplView() { MediaNotificationContainerImplView::~MediaNotificationContainerImplView() {
drag_image_widget_.reset();
for (auto& observer : observers_) for (auto& observer : observers_)
observer.OnContainerDestroyed(id_); observer.OnContainerDestroyed(id_);
} }
...@@ -129,6 +133,34 @@ void MediaNotificationContainerImplView::RemovedFromWidget() { ...@@ -129,6 +133,34 @@ void MediaNotificationContainerImplView::RemovedFromWidget() {
GetFocusManager()->RemoveFocusChangeListener(this); GetFocusManager()->RemoveFocusChangeListener(this);
} }
void MediaNotificationContainerImplView::CreateDragImageWidget() {
views::Widget::InitParams params;
params.type = views::Widget::InitParams::TYPE_DRAG;
params.name = "DragImage";
params.accept_events = false;
params.shadow_type = views::Widget::InitParams::ShadowType::kNone;
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
params.context = GetWidget()->GetNativeWindow();
drag_image_widget_ = views::UniqueWidgetPtr(
std::make_unique<views::Widget>(std::move(params)));
drag_image_widget_->SetOpacity(kDragImageOpacity);
views::ImageView* image_view =
drag_image_widget_->SetContentsView(std::make_unique<views::ImageView>());
SkBitmap bitmap;
view_->Paint(views::PaintInfo::CreateRootPaintInfo(
ui::CanvasPainter(&bitmap, GetPreferredSize(), 1.f, SK_ColorTRANSPARENT,
true /* is_pixel_canvas */)
.context(),
GetPreferredSize()));
gfx::ImageSkia image(gfx::ImageSkiaRep(bitmap, 1.f));
image_view->SetImage(image);
drag_image_widget_->Show();
}
bool MediaNotificationContainerImplView::OnMousePressed( bool MediaNotificationContainerImplView::OnMousePressed(
const ui::MouseEvent& event) { const ui::MouseEvent& event) {
// Reset the |is_dragging_| flag to track whether this is a drag or a click. // Reset the |is_dragging_| flag to track whether this is a drag or a click.
...@@ -170,9 +202,9 @@ bool MediaNotificationContainerImplView::OnMouseDragged( ...@@ -170,9 +202,9 @@ bool MediaNotificationContainerImplView::OnMouseDragged(
return true; return true;
} }
gfx::Transform transform; if (!drag_image_widget_)
transform.Translate(movement); CreateDragImageWidget();
swipeable_container_->layer()->SetTransform(transform); drag_image_widget_->SetBounds(GetBoundsInScreen() + movement);
return true; return true;
} }
...@@ -196,6 +228,8 @@ void MediaNotificationContainerImplView::OnMouseReleased( ...@@ -196,6 +228,8 @@ void MediaNotificationContainerImplView::OnMouseReleased(
for (auto& observer : observers_) for (auto& observer : observers_)
observer.OnContainerDraggedOut(id_, dragged_bounds); observer.OnContainerDraggedOut(id_, dragged_bounds);
} }
drag_image_widget_.reset();
} }
void MediaNotificationContainerImplView::OnMouseEntered( void MediaNotificationContainerImplView::OnMouseEntered(
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "ui/views/animation/slide_out_controller_delegate.h" #include "ui/views/animation/slide_out_controller_delegate.h"
#include "ui/views/controls/button/button.h" #include "ui/views/controls/button/button.h"
#include "ui/views/focus/focus_manager.h" #include "ui/views/focus/focus_manager.h"
#include "ui/views/widget/unique_widget_ptr.h"
namespace media_message_center { namespace media_message_center {
class MediaNotificationItem; class MediaNotificationItem;
...@@ -102,6 +103,10 @@ class MediaNotificationContainerImplView ...@@ -102,6 +103,10 @@ class MediaNotificationContainerImplView
bool is_playing_for_testing() { return is_playing_; } bool is_playing_for_testing() { return is_playing_; }
views::Widget* drag_image_widget_for_testing() {
return drag_image_widget_.get();
}
private: private:
class DismissButton; class DismissButton;
...@@ -113,6 +118,8 @@ class MediaNotificationContainerImplView ...@@ -113,6 +118,8 @@ class MediaNotificationContainerImplView
void DismissNotification(); void DismissNotification();
void CreateDragImageWidget();
// Updates the forced expanded state of |view_|. // Updates the forced expanded state of |view_|.
void ForceExpandedState(); void ForceExpandedState();
...@@ -171,6 +178,8 @@ class MediaNotificationContainerImplView ...@@ -171,6 +178,8 @@ class MediaNotificationContainerImplView
OverlayMediaNotificationView* overlay_ = nullptr; OverlayMediaNotificationView* overlay_ = nullptr;
views::UniqueWidgetPtr drag_image_widget_;
DISALLOW_COPY_AND_ASSIGN(MediaNotificationContainerImplView); DISALLOW_COPY_AND_ASSIGN(MediaNotificationContainerImplView);
}; };
......
...@@ -252,22 +252,38 @@ class MediaNotificationContainerImplViewOverlayControlsTest ...@@ -252,22 +252,38 @@ class MediaNotificationContainerImplViewOverlayControlsTest
MediaNotificationContainerImplViewTest::SetUp(); MediaNotificationContainerImplViewTest::SetUp();
} }
void SimulateMouseDrag(gfx::Vector2d drag_distance) { void SimulateMouseDragAndRelease(gfx::Vector2d drag_distance) {
gfx::Rect start_bounds = notification_container()->bounds(); gfx::Rect start_bounds = notification_container()->bounds();
gfx::Point drag_start = start_bounds.CenterPoint(); gfx::Point drag_start = start_bounds.CenterPoint();
gfx::Point drag_end = drag_start + drag_distance; gfx::Point drag_end = drag_start + drag_distance;
SimulateMousePressed(drag_start);
SimulateMouseDragged(drag_end);
SimulateMouseReleased(drag_end);
}
void SimulateMousePressed(gfx::Point point) {
notification_container()->OnMousePressed( notification_container()->OnMousePressed(
ui::MouseEvent(ui::ET_MOUSE_PRESSED, drag_start, drag_start, ui::MouseEvent(ui::ET_MOUSE_PRESSED, point, point,
ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0)); ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0));
}
void SimulateMouseDragged(gfx::Point point) {
notification_container()->OnMouseDragged( notification_container()->OnMouseDragged(
ui::MouseEvent(ui::ET_MOUSE_DRAGGED, drag_end, drag_end, ui::MouseEvent(ui::ET_MOUSE_DRAGGED, point, point,
ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0)); ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0));
}
void SimulateMouseReleased(gfx::Point point) {
notification_container()->OnMouseReleased( notification_container()->OnMouseReleased(
ui::MouseEvent(ui::ET_MOUSE_RELEASED, drag_end, drag_end, ui::MouseEvent(ui::ET_MOUSE_RELEASED, point, point,
ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0)); ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0));
} }
views::Widget* GetDragImageWidget() {
return notification_container()->drag_image_widget_for_testing();
}
private: private:
base::test::ScopedFeatureList feature_list_; base::test::ScopedFeatureList feature_list_;
}; };
...@@ -393,7 +409,7 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest, ...@@ -393,7 +409,7 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest,
EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)); EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId));
EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _)) EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _))
.Times(0); .Times(0);
SimulateMouseDrag(gfx::Vector2d(1, 1)); SimulateMouseDragAndRelease(gfx::Vector2d(1, 1));
testing::Mock::VerifyAndClearExpectations(&observer()); testing::Mock::VerifyAndClearExpectations(&observer());
} }
...@@ -405,7 +421,7 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest, ...@@ -405,7 +421,7 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest,
EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)).Times(0); EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)).Times(0);
EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _)) EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _))
.Times(0); .Times(0);
SimulateMouseDrag(gfx::Vector2d(20, 20)); SimulateMouseDragAndRelease(gfx::Vector2d(20, 20));
testing::Mock::VerifyAndClearExpectations(&observer()); testing::Mock::VerifyAndClearExpectations(&observer());
} }
...@@ -416,7 +432,24 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest, ...@@ -416,7 +432,24 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest,
// |OnContainerDraggedOut()| notification. // |OnContainerDraggedOut()| notification.
EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)).Times(0); EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)).Times(0);
EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _)); EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _));
SimulateMouseDrag( SimulateMouseDragAndRelease(
notification_container()->bounds().bottom_right().OffsetFromOrigin()); notification_container()->bounds().bottom_right().OffsetFromOrigin());
testing::Mock::VerifyAndClearExpectations(&observer()); testing::Mock::VerifyAndClearExpectations(&observer());
} }
TEST_F(MediaNotificationContainerImplViewOverlayControlsTest, DragImage) {
gfx::Point start_point =
notification_container()->GetBoundsInScreen().CenterPoint();
gfx::Point end_point = start_point + gfx::Vector2d(50, 50);
EXPECT_EQ(GetDragImageWidget(), nullptr);
SimulateMousePressed(start_point);
SimulateMouseDragged(end_point);
EXPECT_NE(GetDragImageWidget(), nullptr);
EXPECT_EQ(GetDragImageWidget()->GetWindowBoundsInScreen().CenterPoint(),
end_point);
SimulateMouseReleased(end_point);
EXPECT_EQ(GetDragImageWidget(), nullptr);
}
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