| // 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_ |