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 @@
#include "components/vector_icons/vector_icons.h"
#include "media/base/media_switches.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/slide_out_controller.h"
#include "ui/views/background.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/button/image_button_factory.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/layout/fill_layout.h"
namespace {
......@@ -30,6 +32,7 @@ constexpr int kDismissButtonIconSize = 20;
constexpr int kDismissButtonBackgroundRadius = 15;
constexpr SkColor kDefaultForegroundColor = SK_ColorBLACK;
constexpr SkColor kDefaultBackgroundColor = SK_ColorTRANSPARENT;
constexpr float kDragImageOpacity = 0.7f;
// The minimum number of enabled and visible user actions such that we should
// force the MediaNotificationView to be expanded.
......@@ -115,6 +118,7 @@ MediaNotificationContainerImplView::MediaNotificationContainerImplView(
}
MediaNotificationContainerImplView::~MediaNotificationContainerImplView() {
drag_image_widget_.reset();
for (auto& observer : observers_)
observer.OnContainerDestroyed(id_);
}
......@@ -129,6 +133,34 @@ void MediaNotificationContainerImplView::RemovedFromWidget() {
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(
const ui::MouseEvent& event) {
// Reset the |is_dragging_| flag to track whether this is a drag or a click.
......@@ -170,9 +202,9 @@ bool MediaNotificationContainerImplView::OnMouseDragged(
return true;
}
gfx::Transform transform;
transform.Translate(movement);
swipeable_container_->layer()->SetTransform(transform);
if (!drag_image_widget_)
CreateDragImageWidget();
drag_image_widget_->SetBounds(GetBoundsInScreen() + movement);
return true;
}
......@@ -196,6 +228,8 @@ void MediaNotificationContainerImplView::OnMouseReleased(
for (auto& observer : observers_)
observer.OnContainerDraggedOut(id_, dragged_bounds);
}
drag_image_widget_.reset();
}
void MediaNotificationContainerImplView::OnMouseEntered(
......
......@@ -16,6 +16,7 @@
#include "ui/views/animation/slide_out_controller_delegate.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/focus/focus_manager.h"
#include "ui/views/widget/unique_widget_ptr.h"
namespace media_message_center {
class MediaNotificationItem;
......@@ -102,6 +103,10 @@ class MediaNotificationContainerImplView
bool is_playing_for_testing() { return is_playing_; }
views::Widget* drag_image_widget_for_testing() {
return drag_image_widget_.get();
}
private:
class DismissButton;
......@@ -113,6 +118,8 @@ class MediaNotificationContainerImplView
void DismissNotification();
void CreateDragImageWidget();
// Updates the forced expanded state of |view_|.
void ForceExpandedState();
......@@ -171,6 +178,8 @@ class MediaNotificationContainerImplView
OverlayMediaNotificationView* overlay_ = nullptr;
views::UniqueWidgetPtr drag_image_widget_;
DISALLOW_COPY_AND_ASSIGN(MediaNotificationContainerImplView);
};
......
......@@ -252,22 +252,38 @@ class MediaNotificationContainerImplViewOverlayControlsTest
MediaNotificationContainerImplViewTest::SetUp();
}
void SimulateMouseDrag(gfx::Vector2d drag_distance) {
void SimulateMouseDragAndRelease(gfx::Vector2d drag_distance) {
gfx::Rect start_bounds = notification_container()->bounds();
gfx::Point drag_start = start_bounds.CenterPoint();
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(
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));
}
void SimulateMouseDragged(gfx::Point point) {
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));
}
void SimulateMouseReleased(gfx::Point point) {
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));
}
views::Widget* GetDragImageWidget() {
return notification_container()->drag_image_widget_for_testing();
}
private:
base::test::ScopedFeatureList feature_list_;
};
......@@ -393,7 +409,7 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest,
EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId));
EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _))
.Times(0);
SimulateMouseDrag(gfx::Vector2d(1, 1));
SimulateMouseDragAndRelease(gfx::Vector2d(1, 1));
testing::Mock::VerifyAndClearExpectations(&observer());
}
......@@ -405,7 +421,7 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest,
EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)).Times(0);
EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _))
.Times(0);
SimulateMouseDrag(gfx::Vector2d(20, 20));
SimulateMouseDragAndRelease(gfx::Vector2d(20, 20));
testing::Mock::VerifyAndClearExpectations(&observer());
}
......@@ -416,7 +432,24 @@ TEST_F(MediaNotificationContainerImplViewOverlayControlsTest,
// |OnContainerDraggedOut()| notification.
EXPECT_CALL(observer(), OnContainerClicked(kTestNotificationId)).Times(0);
EXPECT_CALL(observer(), OnContainerDraggedOut(kTestNotificationId, _));
SimulateMouseDrag(
SimulateMouseDragAndRelease(
notification_container()->bounds().bottom_right().OffsetFromOrigin());
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