| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_ASH_EXTENSIONS_FILE_MANAGER_DRIVEFS_EVENT_ROUTER_H_ |
| #define CHROME_BROWSER_ASH_EXTENSIONS_FILE_MANAGER_DRIVEFS_EVENT_ROUTER_H_ |
| |
| #include <map> |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/functional/callback_forward.h" |
| #include "base/values.h" |
| #include "chrome/browser/ash/extensions/file_manager/system_notification_manager.h" |
| #include "chromeos/ash/components/drivefs/drivefs_host_observer.h" |
| #include "chromeos/ash/components/drivefs/mojom/drivefs.mojom.h" |
| #include "chromeos/ash/components/drivefs/sync_status_tracker.h" |
| #include "extensions/browser/extension_event_histogram_value.h" |
| #include "url/gurl.h" |
| |
| namespace base { |
| class FilePath; |
| } |
| |
| namespace extensions { |
| namespace api { |
| namespace file_manager_private { |
| struct FileTransferStatus; |
| struct IndividualFileTransferStatus; |
| struct FileWatchEvent; |
| } // namespace file_manager_private |
| } // namespace api |
| } // namespace extensions |
| |
| namespace file_manager { |
| |
| using extensions::api::file_manager_private::FileTransferStatus; |
| using IndividualFileTransferStatus = |
| extensions::api::file_manager_private::SyncState; |
| |
| // Files app's event router handling DriveFS-related events. |
| class DriveFsEventRouter : public drivefs::DriveFsHostObserver { |
| public: |
| explicit DriveFsEventRouter(SystemNotificationManager* notification_manager); |
| DriveFsEventRouter(const DriveFsEventRouter&) = delete; |
| ~DriveFsEventRouter() override; |
| |
| DriveFsEventRouter& operator=(const DriveFsEventRouter&) = delete; |
| |
| // Triggers an event in the UI to display a confirmation dialog. |
| void DisplayConfirmDialog( |
| const drivefs::mojom::DialogReason& reason, |
| base::OnceCallback<void(drivefs::mojom::DialogResult)> callback); |
| |
| // Called from the UI to notify the caller of DisplayConfirmDialog() of the |
| // dialog's result. |
| void OnDialogResult(drivefs::mojom::DialogResult result); |
| |
| // In some cases, we might want to disable Drive notifications for a file |
| // identified by its relative Drive path. These methods help control when to |
| // suppress and restore these notifications. |
| void SuppressNotificationsForFilePath(const base::FilePath& path); |
| void RestoreNotificationsForFilePath(const base::FilePath& path); |
| |
| protected: |
| SystemNotificationManager* system_notification_manager() { |
| return notification_manager_; |
| } |
| |
| private: |
| struct SyncingStatusState { |
| SyncingStatusState(); |
| SyncingStatusState(const SyncingStatusState& other); |
| ~SyncingStatusState(); |
| |
| std::map<int64_t, int64_t> group_id_to_bytes_to_transfer; |
| int64_t completed_bytes = 0; |
| }; |
| |
| // DriveFsHostObserver: |
| void OnUnmounted() override; |
| void OnSyncingStatusUpdate( |
| const drivefs::mojom::SyncingStatus& status) override; |
| void OnIndividualSyncingStatusesDelta( |
| const std::vector<const drivefs::SyncState>& sync_states) override; |
| void OnFilesChanged( |
| const std::vector<drivefs::mojom::FileChange>& changes) override; |
| void OnError(const drivefs::mojom::DriveError& error) override; |
| |
| virtual std::set<GURL> GetEventListenerURLs( |
| const std::string& event_name) = 0; |
| |
| virtual GURL ConvertDrivePathToFileSystemUrl(const base::FilePath& file_path, |
| const GURL& listener_url) = 0; |
| |
| virtual std::vector<GURL> ConvertPathsToFileSystemUrls( |
| const std::vector<base::FilePath>& paths, |
| const GURL& listener_url) = 0; |
| |
| virtual std::string GetDriveFileSystemName() = 0; |
| |
| virtual bool IsPathWatched(const base::FilePath& path) = 0; |
| |
| void BroadcastTransferEvent( |
| const extensions::events::HistogramValue event_type, |
| const FileTransferStatus& status); |
| |
| void BroadcastIndividualTransfersEvent( |
| const extensions::events::HistogramValue event_type, |
| const std::vector<IndividualFileTransferStatus>& status); |
| |
| void BroadcastOnDirectoryChangedEvent( |
| const base::FilePath& directory, |
| const extensions::api::file_manager_private::FileWatchEvent& event); |
| |
| // Helper method for broadcasting events. |
| virtual void BroadcastEvent( |
| extensions::events::HistogramValue histogram_value, |
| const std::string& event_name, |
| base::Value::List event_args, |
| bool dispatch_to_system_notification = true) = 0; |
| |
| // Send single event with aggregate sync information for all ItemEvents. |
| // Note: this assumes all ItemEvents have the same `reason`. |
| void BroadcastAggregateTransferEventForItems( |
| const std::vector<const drivefs::mojom::ItemEvent*>& items, |
| const extensions::events::HistogramValue& event_type, |
| const std::string& event_name, |
| SyncingStatusState& state); |
| |
| // Send single event with array of per-file sync information for all |
| // ItemEvents. Note: this assumes all ItemEvents have the same `reason`. |
| void BroadcastIndividualTransferEventsForItems( |
| const std::vector<const drivefs::mojom::ItemEvent*>& items, |
| const extensions::events::HistogramValue& event_type, |
| const std::string& event_name); |
| |
| // This is owned by EventRouter and only shared with this class. |
| SystemNotificationManager* notification_manager_; |
| |
| SyncingStatusState sync_status_state_; |
| SyncingStatusState pin_status_state_; |
| // Set of paths for which Drive transfer events are ignored. |
| std::set<base::FilePath> ignored_file_paths_; |
| base::OnceCallback<void(drivefs::mojom::DialogResult)> dialog_callback_; |
| |
| base::WeakPtrFactory<DriveFsEventRouter> weak_ptr_factory_{this}; |
| }; |
| |
| } // namespace file_manager |
| |
| #endif // CHROME_BROWSER_ASH_EXTENSIONS_FILE_MANAGER_DRIVEFS_EVENT_ROUTER_H_ |