| // Copyright 2022 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_FILE_SUGGEST_LOCAL_FILE_SUGGESTION_PROVIDER_H_ | 
 | #define CHROME_BROWSER_ASH_FILE_SUGGEST_LOCAL_FILE_SUGGESTION_PROVIDER_H_ | 
 |  | 
 | #include "base/callback_list.h" | 
 | #include "base/files/file_path.h" | 
 | #include "base/memory/raw_ptr.h" | 
 | #include "base/memory/weak_ptr.h" | 
 | #include "base/scoped_observation.h" | 
 | #include "base/task/sequenced_task_runner.h" | 
 | #include "base/time/time.h" | 
 | #include "chrome/browser/ash/app_list/search/util/mrfu_cache.h" | 
 | #include "chrome/browser/ash/file_manager/file_tasks_notifier.h" | 
 | #include "chrome/browser/ash/file_manager/file_tasks_observer.h" | 
 | #include "chrome/browser/ash/file_suggest/file_suggest_util.h" | 
 | #include "chrome/browser/ash/file_suggest/file_suggestion_provider.h" | 
 |  | 
 | class Profile; | 
 |  | 
 | namespace ash { | 
 |  | 
 | // This is the provider for local file suggestions. | 
 | // Currently stubbed. | 
 | class LocalFileSuggestionProvider | 
 |     : public FileSuggestionProvider, | 
 |       public file_manager::file_tasks::FileTasksObserver { | 
 |  public: | 
 |   struct LocalFileData { | 
 |     float score; | 
 |     base::FilePath path; | 
 |     base::File::Info info; | 
 |   }; | 
 |  | 
 |   LocalFileSuggestionProvider( | 
 |       Profile* profile, | 
 |       base::RepeatingCallback<void(FileSuggestionType)> notify_update_callback); | 
 |   LocalFileSuggestionProvider(const LocalFileSuggestionProvider&) = delete; | 
 |   LocalFileSuggestionProvider& operator=(const LocalFileSuggestionProvider&) = | 
 |       delete; | 
 |   ~LocalFileSuggestionProvider() override; | 
 |  | 
 |   // Returns true if the MrfuCache is initialized. | 
 |   bool IsInitialized() const; | 
 |  | 
 |   // FileSuggestionProvider: | 
 |   void GetSuggestFileData(GetSuggestFileDataCallback callback) override; | 
 |   void MaybeUpdateItemSuggestCache( | 
 |       base::PassKey<FileSuggestKeyedService>) override; | 
 |  | 
 |   // file_manager::file_tasks::FileTaskObserver: | 
 |   void OnFilesOpened(const std::vector<FileOpenEvent>& file_opens) override; | 
 |  | 
 |  | 
 |  private: | 
 |   void OnProtoInitialized(); | 
 |   void OnValidationComplete(std::pair<std::vector<LocalFileData>, | 
 |                                       std::vector<base::FilePath>> results); | 
 |  | 
 |   const raw_ptr<Profile> profile_; | 
 |  | 
 |   // Any file not modified at least as recently as `max_last_modified_time_` ago | 
 |   // will be filtered out of results. | 
 |   const base::TimeDelta max_last_modified_time_; | 
 |  | 
 |   std::unique_ptr<app_list::MrfuCache> files_ranker_; | 
 |  | 
 |   // After a file is opened, if this timer is not running, we set it to run for | 
 |   // a brief delay and then call `NotifySuggestionUpdate()`. This debounces file | 
 |   // open events to prevent us from calling it many times instantly when many | 
 |   // files are opened at once. | 
 |   base::OneShotTimer queued_notification_; | 
 |  | 
 |   // Callbacks awaiting validation completion. This prevents issues in the event | 
 |   // that multiple clients request results simultaneously. | 
 |   base::OnceCallbackList<GetSuggestFileDataCallback::RunType> | 
 |       on_validation_complete_callback_list_; | 
 |  | 
 |   base::ScopedObservation<file_manager::file_tasks::FileTasksNotifier, | 
 |                           file_manager::file_tasks::FileTasksObserver> | 
 |       file_tasks_observer_{this}; | 
 |  | 
 |   // A list of paths that represent absolute locations for enabled trash folders | 
 |   // on the users system. This list is only used if the Trash feature and | 
 |   // enterprise policy are enabled. | 
 |   std::vector<base::FilePath> trash_paths_; | 
 |  | 
 |   scoped_refptr<base::SequencedTaskRunner> task_runner_; | 
 |  | 
 |   base::WeakPtrFactory<LocalFileSuggestionProvider> weak_factory_{this}; | 
 | }; | 
 |  | 
 | }  // namespace ash | 
 |  | 
 | #endif  // CHROME_BROWSER_ASH_FILE_SUGGEST_LOCAL_FILE_SUGGESTION_PROVIDER_H_ |