OLD | NEW |
(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 } |
OLD | NEW |