Index: ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm |
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..47fb7a6eaf5fe1db25075d5bd81728d858ef273f |
--- /dev/null |
+++ b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm |
@@ -0,0 +1,100 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h" |
+ |
+#include <memory> |
+ |
+#include "components/reading_list/ios/reading_list_model.h" |
+#import "ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+class ReadingListObserverBridge; |
+ |
+@interface ReadingListMenuNotifier () { |
+ // Observer for reading list changes. |
+ std::unique_ptr<ReadingListObserverBridge> _readingListObserverBridge; |
+ |
+ // Backing object for property of the same name. |
+ __weak id<ReadingListMenuNotificationDelegate> _delegate; |
+ |
+ // Keep a reference to detach before deallocing. |
+ ReadingListModel* _readingListModel; // weak |
+} |
+ |
+// Detach the observer on the reading list. |
+- (void)detachReadingListModel; |
+ |
+// Handle callbacks from the reading list model observer. |
+- (void)readingListModelCompletedBatchUpdates:(const ReadingListModel*)model; |
+ |
+@end |
+ |
+// TODO(crbug.com/590725): use the one-and-only protocol-based implementation of |
+// ReadingListModelObserver |
+class ReadingListObserverBridge : public ReadingListModelObserver { |
+ public: |
+ explicit ReadingListObserverBridge(ReadingListMenuNotifier* owner) |
+ : owner_(owner) {} |
+ |
+ ~ReadingListObserverBridge() override {} |
+ |
+ void ReadingListModelLoaded(const ReadingListModel* model) override {} |
+ |
+ void ReadingListModelBeganBatchUpdates( |
+ const ReadingListModel* model) override {} |
+ |
+ void ReadingListModelCompletedBatchUpdates( |
+ const ReadingListModel* model) override { |
+ [owner_ readingListModelCompletedBatchUpdates:model]; |
+ } |
+ |
+ void ReadingListModelBeingDeleted(const ReadingListModel* model) override{}; |
+ |
+ void ReadingListDidApplyChanges(ReadingListModel* model) override { |
+ [owner_ readingListModelCompletedBatchUpdates:model]; |
+ } |
+ |
+ private: |
+ ReadingListMenuNotifier* owner_; // weak, owns us |
+}; |
+ |
+@implementation ReadingListMenuNotifier |
+@synthesize delegate = _delegate; |
+ |
+- (instancetype)initWithReadingList:(ReadingListModel*)readingListModel { |
+ if (self = [super init]) { |
+ _readingListObserverBridge.reset(new ReadingListObserverBridge(self)); |
+ _readingListModel = readingListModel; |
+ _readingListModel->AddObserver(_readingListObserverBridge.get()); |
+ } |
+ return self; |
+} |
+ |
+- (void)dealloc { |
+ [self detachReadingListModel]; |
+} |
+ |
+- (void)detachReadingListModel { |
+ _readingListModel->RemoveObserver(_readingListObserverBridge.get()); |
+ _readingListObserverBridge.reset(); |
+} |
+ |
+- (void)readingListModelCompletedBatchUpdates:(const ReadingListModel*)model { |
+ [_delegate unreadCountChanged:model->unread_size()]; |
+ [_delegate unseenStateChanged:model->HasUnseenEntries()]; |
+} |
+ |
+- (NSInteger)readingListUnreadCount { |
+ return _readingListModel->unread_size(); |
+} |
+ |
+- (BOOL)readingListUnseenItemsExist { |
+ return _readingListModel->HasUnseenEntries(); |
+} |
+ |
+@end |