Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: ios/clean/chrome/browser/ui/overlay_service/internal/overlay_queue.mm

Issue 2921833002: [iOS Clean] Created OverlayService.
Patch Set: rebase & Mark's comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "ios/clean/chrome/browser/ui/overlay_service/internal/overlay_queue.h"
6
7 #include "base/logging.h"
8
9 #if !defined(__has_feature) || !__has_feature(objc_arc)
10 #error "This file requires ARC support."
11 #endif
12
13 OverlayQueue::OverlayQueue()
14 : overlays_([[NSMutableArray<BrowserCoordinator*> alloc] init]),
15 showing_overlay_(false) {}
16
17 OverlayQueue::~OverlayQueue() {
18 CancelOverlays();
19 }
20
21 void OverlayQueue::AddObserver(OverlayQueueObserver* observer) {
22 observers_.AddObserver(observer);
23 }
24
25 void OverlayQueue::RemoveObserver(OverlayQueueObserver* observer) {
26 observers_.RemoveObserver(observer);
27 }
28
29 void OverlayQueue::OverlayWasStopped(BrowserCoordinator* overlay_coordinator) {
30 DCHECK(overlay_coordinator);
31 DCHECK_EQ(GetFirstOverlay(), overlay_coordinator);
32 DCHECK(showing_overlay_);
33 [overlays_ removeObjectAtIndex:0];
34 showing_overlay_ = false;
35 for (auto& observer : observers_) {
36 observer.OverlayQueueDidStopVisibleOverlay(this);
37 }
38 }
39
40 void OverlayQueue::ReplaceVisibleOverlay(
41 BrowserCoordinator* overlay_coordinator) {
42 DCHECK(overlay_coordinator);
43 DCHECK(IsShowingOverlay());
44 DCHECK_GE([overlays_ count], 1U);
45 // Add the overlay after the currently displayed overlay and notify observers
46 // before stopping the current overlay.
47 for (auto& observer : observers_) {
48 observer.OverlayQueueWillReplaceVisibleOverlay(this);
49 }
50 [overlays_ insertObject:overlay_coordinator atIndex:1];
51 DCHECK(!overlay_coordinator.overlayQueue);
52 overlay_coordinator.overlayQueue = this;
53 BrowserCoordinator* visible_overlay = GetFirstOverlay();
54 [visible_overlay cancelOverlay];
55 [visible_overlay stop];
56 }
57
58 bool OverlayQueue::HasQueuedOverlays() const {
59 return GetCount() > 0U;
60 }
61
62 bool OverlayQueue::IsShowingOverlay() const {
63 return showing_overlay_;
64 }
65
66 void OverlayQueue::CancelOverlays() {
67 // Cancel all overlays in the queue.
68 for (BrowserCoordinator* overlay_coordinator in overlays_) {
69 [overlay_coordinator cancelOverlay];
70 }
71 for (auto& observer : observers_) {
72 observer.OverlayQueueDidCancelOverlays(this);
73 }
74 // Stop the visible overlay before emptying the queue.
75 if (IsShowingOverlay())
76 [GetFirstOverlay() stop];
77 [overlays_ removeAllObjects];
78 }
79
80 web::WebState* OverlayQueue::GetWebState() const {
81 return nullptr;
82 }
83
84 void OverlayQueue::AddOverlay(BrowserCoordinator* overlay_coordinator) {
85 // Add the overlay coordinator to the queue, then notify observers.
86 DCHECK(overlay_coordinator);
87 DCHECK(!overlay_coordinator.overlayQueue);
88 [overlays_ addObject:overlay_coordinator];
89 overlay_coordinator.overlayQueue = this;
90 for (auto& observer : observers_) {
91 observer.OverlayQueueDidAddOverlay(this);
92 }
93 }
94
95 NSUInteger OverlayQueue::GetCount() const {
96 return [overlays_ count];
97 }
98
99 BrowserCoordinator* OverlayQueue::GetFirstOverlay() {
100 return HasQueuedOverlays() ? [overlays_ firstObject] : nil;
101 }
102
103 void OverlayQueue::OverlayWasStarted() {
104 showing_overlay_ = true;
105 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698