Commit 0e450535 authored by David Black's avatar David Black Committed by Chromium LUCI CQ

Forward controller/model observer events from child bubbles.

Similar to as was done for the holding space tray icon, holding space
item views sections will no longer directly observe the holding space
controller and/or model. Instead, these events will be forwarded from
its parent, a holding space child bubble.

In the next CL to follow, holding space child bubbles may sometimes
withhold events from item views sections, such as when the child bubble
is being animated out.

There should be no user visible change as a result of this CL.

Bug: 1154998
Change-Id: Iccdeaee7dabfd3eeaa5eec0448e300d215377ba8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2605419Reviewed-by: default avatarToni Baržić <tbarzic@chromium.org>
Commit-Queue: David Black <dmblack@google.com>
Cr-Commit-Position: refs/heads/master@{#839616}
parent 12f37dd2
......@@ -5,6 +5,8 @@
#include "ash/system/holding_space/holding_space_item_views_section.h"
#include "ash/public/cpp/holding_space/holding_space_constants.h"
#include "ash/public/cpp/holding_space/holding_space_controller.h"
#include "ash/public/cpp/holding_space/holding_space_model.h"
#include "ash/system/holding_space/holding_space_item_view.h"
#include "ash/system/holding_space/holding_space_item_view_delegate.h"
#include "base/auto_reset.h"
......@@ -175,9 +177,7 @@ HoldingSpaceItemViewsSection::HoldingSpaceItemViewsSection(
const base::Optional<size_t>& max_count)
: delegate_(delegate),
supported_types_(std::move(supported_types)),
max_count_(max_count) {
controller_observer_.Observe(HoldingSpaceController::Get());
}
max_count_(max_count) {}
HoldingSpaceItemViewsSection::~HoldingSpaceItemViewsSection() = default;
......@@ -244,9 +244,6 @@ void HoldingSpaceItemViewsSection::Init() {
}
void HoldingSpaceItemViewsSection::Reset() {
model_observer_.Reset();
controller_observer_.Reset();
// The holding space item views `delegate_` will be destroyed before this view
// when asynchronously closing the holding space bubble. To prevent accessing
// `delegate_` after deletion, prevent animation callbacks from being run.
......@@ -309,8 +306,6 @@ void HoldingSpaceItemViewsSection::ViewHierarchyChanged(
void HoldingSpaceItemViewsSection::OnHoldingSpaceModelAttached(
HoldingSpaceModel* model) {
model_observer_.Observe(model);
std::vector<const HoldingSpaceItem*> item_ptrs;
for (const auto& item : model->items())
item_ptrs.push_back(item.get());
......@@ -321,7 +316,6 @@ void HoldingSpaceItemViewsSection::OnHoldingSpaceModelAttached(
void HoldingSpaceItemViewsSection::OnHoldingSpaceModelDetached(
HoldingSpaceModel* model) {
model_observer_.Reset();
if (!container_->children().empty())
MaybeAnimateOut();
}
......
......@@ -10,13 +10,8 @@
#include <string>
#include <vector>
#include "ash/public/cpp/holding_space/holding_space_controller.h"
#include "ash/public/cpp/holding_space/holding_space_controller_observer.h"
#include "ash/public/cpp/holding_space/holding_space_item.h"
#include "ash/public/cpp/holding_space/holding_space_model.h"
#include "ash/public/cpp/holding_space/holding_space_model_observer.h"
#include "base/optional.h"
#include "base/scoped_observation.h"
#include "ui/views/view.h"
namespace ui {
......@@ -32,11 +27,10 @@ namespace ash {
class HoldingSpaceItemView;
class HoldingSpaceItemViewDelegate;
class HoldingSpaceModel;
// A section of holding space item views in a `HoldingSpaceTrayChildBubble`.
class HoldingSpaceItemViewsSection : public views::View,
public HoldingSpaceControllerObserver,
public HoldingSpaceModelObserver {
class HoldingSpaceItemViewsSection : public views::View {
public:
HoldingSpaceItemViewsSection(
HoldingSpaceItemViewDelegate* delegate,
......@@ -51,9 +45,9 @@ class HoldingSpaceItemViewsSection : public views::View,
// Initializes the section.
void Init();
// Resets the section. Called when the tray bubble starts closing to stop
// observing the holding space controller/model to ensure that no new items
// are created while the bubble widget is being asynchronously closed.
// Resets the section. Called when the tray bubble starts closing to ensure
// that no new items are created while the bubble widget is being
// asynchronously closed.
void Reset();
// views::View:
......@@ -62,16 +56,14 @@ class HoldingSpaceItemViewsSection : public views::View,
void PreferredSizeChanged() override;
void ViewHierarchyChanged(const views::ViewHierarchyChangedDetails&) override;
// HoldingSpaceControllerObserver:
void OnHoldingSpaceModelAttached(HoldingSpaceModel* model) override;
void OnHoldingSpaceModelDetached(HoldingSpaceModel* model) override;
// HoldingSpaceModelObserver:
void OnHoldingSpaceItemsAdded(
const std::vector<const HoldingSpaceItem*>& items) override;
void OnHoldingSpaceItemsRemoved(
const std::vector<const HoldingSpaceItem*>& items) override;
void OnHoldingSpaceItemFinalized(const HoldingSpaceItem* item) override;
// `HoldingSpaceControllerObserver` and `HoldingSpaceModelObserver` events
// forwarded from the parent `HoldingSpaceTrayChildBubble`. Events may be
// withheld from this view if, for example, its parent is animating out.
void OnHoldingSpaceModelAttached(HoldingSpaceModel* model);
void OnHoldingSpaceModelDetached(HoldingSpaceModel* model);
void OnHoldingSpaceItemsAdded(const std::vector<const HoldingSpaceItem*>&);
void OnHoldingSpaceItemsRemoved(const std::vector<const HoldingSpaceItem*>&);
void OnHoldingSpaceItemFinalized(const HoldingSpaceItem* item);
protected:
// Invoked to create the `header_` for this section.
......@@ -149,13 +141,6 @@ class HoldingSpaceItemViewsSection : public views::View,
// and visibility change operations to reduce the number of layout events.
bool disable_preferred_size_changed_ = false;
base::ScopedObservation<HoldingSpaceController,
HoldingSpaceControllerObserver>
controller_observer_{this};
base::ScopedObservation<HoldingSpaceModel, HoldingSpaceModelObserver>
model_observer_{this};
base::WeakPtrFactory<HoldingSpaceItemViewsSection> weak_factory_{this};
};
......
......@@ -68,7 +68,11 @@ class TopAlignedBoxLayout : public views::BoxLayout {
HoldingSpaceTrayChildBubble::HoldingSpaceTrayChildBubble(
HoldingSpaceItemViewDelegate* delegate)
: delegate_(delegate) {}
: delegate_(delegate) {
controller_observer_.Observe(HoldingSpaceController::Get());
if (HoldingSpaceController::Get()->model())
model_observer_.Observe(HoldingSpaceController::Get()->model());
}
HoldingSpaceTrayChildBubble::~HoldingSpaceTrayChildBubble() = default;
......@@ -95,10 +99,44 @@ void HoldingSpaceTrayChildBubble::Init() {
}
void HoldingSpaceTrayChildBubble::Reset() {
model_observer_.Reset();
controller_observer_.Reset();
for (HoldingSpaceItemViewsSection* section : sections_)
section->Reset();
}
void HoldingSpaceTrayChildBubble::OnHoldingSpaceModelAttached(
HoldingSpaceModel* model) {
model_observer_.Observe(model);
for (HoldingSpaceItemViewsSection* section : sections_)
section->OnHoldingSpaceModelAttached(model);
}
void HoldingSpaceTrayChildBubble::OnHoldingSpaceModelDetached(
HoldingSpaceModel* model) {
model_observer_.Reset();
for (HoldingSpaceItemViewsSection* section : sections_)
section->OnHoldingSpaceModelDetached(model);
}
void HoldingSpaceTrayChildBubble::OnHoldingSpaceItemsAdded(
const std::vector<const HoldingSpaceItem*>& items) {
for (HoldingSpaceItemViewsSection* section : sections_)
section->OnHoldingSpaceItemsAdded(items);
}
void HoldingSpaceTrayChildBubble::OnHoldingSpaceItemsRemoved(
const std::vector<const HoldingSpaceItem*>& items) {
for (HoldingSpaceItemViewsSection* section : sections_)
section->OnHoldingSpaceItemsRemoved(items);
}
void HoldingSpaceTrayChildBubble::OnHoldingSpaceItemFinalized(
const HoldingSpaceItem* item) {
for (HoldingSpaceItemViewsSection* section : sections_)
section->OnHoldingSpaceItemFinalized(item);
}
const char* HoldingSpaceTrayChildBubble::GetClassName() const {
return "HoldingSpaceTrayChildBubble";
}
......
......@@ -8,6 +8,11 @@
#include <memory>
#include <vector>
#include "ash/public/cpp/holding_space/holding_space_controller.h"
#include "ash/public/cpp/holding_space/holding_space_controller_observer.h"
#include "ash/public/cpp/holding_space/holding_space_model.h"
#include "ash/public/cpp/holding_space/holding_space_model_observer.h"
#include "base/scoped_observation.h"
#include "ui/views/view.h"
namespace ash {
......@@ -16,7 +21,9 @@ class HoldingSpaceItemViewDelegate;
class HoldingSpaceItemViewsSection;
// Child bubble of the `HoldingSpaceTrayBubble`.
class HoldingSpaceTrayChildBubble : public views::View {
class HoldingSpaceTrayChildBubble : public views::View,
public HoldingSpaceControllerObserver,
public HoldingSpaceModelObserver {
public:
explicit HoldingSpaceTrayChildBubble(HoldingSpaceItemViewDelegate* delegate);
HoldingSpaceTrayChildBubble(const HoldingSpaceTrayChildBubble& other) =
......@@ -33,6 +40,17 @@ class HoldingSpaceTrayChildBubble : public views::View {
// are created while the bubble widget is begin asynchronously closed.
void Reset();
// HoldingSpaceControllerObserver:
void OnHoldingSpaceModelAttached(HoldingSpaceModel* model) override;
void OnHoldingSpaceModelDetached(HoldingSpaceModel* model) override;
// HoldingSpaceModelObserver:
void OnHoldingSpaceItemsAdded(
const std::vector<const HoldingSpaceItem*>& items) override;
void OnHoldingSpaceItemsRemoved(
const std::vector<const HoldingSpaceItem*>& items) override;
void OnHoldingSpaceItemFinalized(const HoldingSpaceItem* item) override;
protected:
// Invoked to create the `sections_` for this child bubble.
virtual std::vector<std::unique_ptr<HoldingSpaceItemViewsSection>>
......@@ -50,6 +68,13 @@ class HoldingSpaceTrayChildBubble : public views::View {
// Views owned by view hierarchy.
std::vector<HoldingSpaceItemViewsSection*> sections_;
base::ScopedObservation<HoldingSpaceController,
HoldingSpaceControllerObserver>
controller_observer_{this};
base::ScopedObservation<HoldingSpaceModel, HoldingSpaceModelObserver>
model_observer_{this};
};
} // namespace ash
......
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