Commit dd2fe769 authored by Melissa Zhang's avatar Melissa Zhang Committed by Chromium LUCI CQ

[Sharesheet] Update bubble position with anchor movement

This CL adds a SharesheetParentWidgetObserver which
observes changes in the parent widget and updates the
position of the bubble to remain anchored to it.

Bug: 1159674
Change-Id: I9bc7d180b249fda54bc387b83501063be72ab37f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2596899Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Melissa Zhang <melzhang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#840469}
parent 3e8e19f5
......@@ -10,6 +10,7 @@
#include "ash/public/cpp/ash_typography.h"
#include "ash/public/cpp/tablet_mode.h"
#include "base/i18n/rtl.h"
#include "base/scoped_observation.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "chrome/app/vector_icons/vector_icons.h"
......@@ -49,6 +50,7 @@
#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view_class_properties.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace {
......@@ -106,11 +108,33 @@ bool IsKeyboardCodeArrow(ui::KeyboardCode key_code) {
} // namespace
class SharesheetBubbleView::SharesheetParentWidgetObserver
: public views::WidgetObserver {
public:
SharesheetParentWidgetObserver(SharesheetBubbleView* owner,
views::Widget* widget)
: owner_(owner) {
observer_.Observe(widget);
}
~SharesheetParentWidgetObserver() override = default;
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& bounds) override {
owner_->OnWidgetBoundsChanged(widget, bounds);
}
private:
SharesheetBubbleView* owner_;
base::ScopedObservation<views::Widget, views::WidgetObserver> observer_{this};
};
SharesheetBubbleView::SharesheetBubbleView(
gfx::NativeWindow native_window,
sharesheet::SharesheetServiceDelegate* delegate)
: delegate_(delegate) {
set_parent_window(native_window);
parent_widget_observer_ = std::make_unique<SharesheetParentWidgetObserver>(
this, views::Widget::GetWidgetForNativeWindow(native_window));
parent_view_ =
views::Widget::GetWidgetForNativeWindow(native_window)->GetRootView();
UpdateAnchorPosition();
......@@ -464,6 +488,11 @@ void SharesheetBubbleView::OnWidgetActivationChanged(views::Widget* widget,
}
}
void SharesheetBubbleView::OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& new_bounds) {
UpdateAnchorPosition();
}
void SharesheetBubbleView::CreateBubble() {
set_close_on_deactivate(false);
SetButtons(ui::DIALOG_BUTTON_NONE);
......
......@@ -44,7 +44,13 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView {
void ResizeBubble(const int& width, const int& height);
void CloseBubble();
// views::BubbleDialogDelegateView:
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& new_bounds) override;
private:
class SharesheetParentWidgetObserver;
// ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override;
......@@ -98,6 +104,8 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView {
views::Separator* expanded_view_separator_ = nullptr;
views::View* parent_view_ = nullptr;
SharesheetExpandButton* expand_button_ = nullptr;
std::unique_ptr<SharesheetParentWidgetObserver> parent_widget_observer_;
};
#endif // CHROME_BROWSER_UI_ASH_SHARESHEET_SHARESHEET_BUBBLE_VIEW_H_
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