| // Copyright 2024 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef COMPONENTS_SYNC_SERVICE_LOCAL_DATA_MIGRATION_ITEM_QUEUE_H_ | |
| #define COMPONENTS_SYNC_SERVICE_LOCAL_DATA_MIGRATION_ITEM_QUEUE_H_ | |
| #include <map> | |
| #include <tuple> | |
| #include "base/scoped_observation.h" | |
| #include "base/time/default_clock.h" | |
| #include "components/sync/service/local_data_description.h" | |
| #include "components/sync/service/sync_service_observer.h" | |
| namespace syncer { | |
| class SyncService; | |
| class DataTypeManager; | |
| // This class is used to migrate data to account storage once the sync service | |
| // activates, if the user is eligible for account storage. | |
| // The queue `items_` is cleared when sync is paused or disabled, for example | |
| // when the user signs out. An item is removed from the queue if it had been | |
| // added more than `kTimeLimitForActivatingDataType` minutes ago, or if its data | |
| // type is non-preferred. If the data type is not active, the item stays in the | |
| // queue. | |
| class LocalDataMigrationItemQueue : public SyncServiceObserver { | |
| public: | |
| // `sync_service` and `data_type_manager` must not be null and must outlive | |
| // this class. | |
| LocalDataMigrationItemQueue(SyncService* sync_service, | |
| DataTypeManager* data_type_manager); | |
| ~LocalDataMigrationItemQueue() override; | |
| // Adds the `items` to the queue and triggers `OnStateChanged()` once. If sync | |
| // is disabled or the user has consented to sync, the items are removed again. | |
| void TriggerLocalDataMigrationForItemsWhenTypeBecomesActive( | |
| DataType data_type, | |
| std::vector<LocalDataItemModel::DataId> items); | |
| // SyncServiceObserver: | |
| void OnStateChanged(SyncService* sync_service) override; | |
| void OnSyncShutdown(SyncService* sync_service) override; | |
| void SetClockForTesting(base::Clock* clock); | |
| // Returns the number of items in the queue `items_`. | |
| size_t GetItemsCountForTesting() const; | |
| private: | |
| const raw_ptr<SyncService> sync_service_; | |
| const raw_ptr<DataTypeManager> data_type_manager_; | |
| raw_ptr<base::Clock> clock_; | |
| // TODO (crbug.com/385310859): Create a function that converts from `DataId` | |
| // to `DataType` so that we don't need to store this information. | |
| std::map<syncer::LocalDataItemModel::DataId, std::tuple<DataType, base::Time>> | |
| items_; | |
| base::ScopedObservation<SyncService, SyncServiceObserver> | |
| sync_service_observer_{this}; | |
| }; | |
| } // namespace syncer | |
| #endif // COMPONENTS_SYNC_SERVICE_LOCAL_DATA_MIGRATION_ITEM_QUEUE_H_ |