[go: nahoru, domu]

blob: 2e2ecba88e8ecced1d83bd2de1796645162a4b24 [file] [log] [blame]
// Copyright 2023 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_DRIVE_RECENT_FILE_SUGGESTION_PROVIDER_H_
#define CHROME_BROWSER_ASH_FILE_SUGGEST_DRIVE_RECENT_FILE_SUGGESTION_PROVIDER_H_
#include <map>
#include <vector>
#include "base/callback_list.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ash/drive/drive_integration_service.h"
#include "chrome/browser/ash/file_suggest/file_suggestion_provider.h"
#include "chromeos/ash/components/drivefs/drivefs_host.h"
#include "chromeos/ash/components/drivefs/mojom/drivefs.mojom.h"
class Profile;
namespace ash {
class FileSuggestKeyedService;
// A suggestion provider for most recently used drive files.
class DriveRecentFileSuggestionProvider
: public FileSuggestionProvider,
public drive::DriveIntegrationService::Observer,
public drivefs::DriveFsHost::Observer {
public:
DriveRecentFileSuggestionProvider(
Profile* profile,
base::RepeatingCallback<void(FileSuggestionType)> notify_update_callback);
DriveRecentFileSuggestionProvider(const DriveRecentFileSuggestionProvider&) =
delete;
DriveRecentFileSuggestionProvider& operator=(
const DriveRecentFileSuggestionProvider&) = delete;
~DriveRecentFileSuggestionProvider() override;
// FileSuggestionProvider:
void GetSuggestFileData(GetSuggestFileDataCallback callback) override;
void MaybeUpdateItemSuggestCache(
base::PassKey<FileSuggestKeyedService>) override;
// drive::DriveIntegrationService::Observer:
void OnDriveIntegrationServiceDestroyed() override;
void OnFileSystemMounted() override;
// drivefs::DriveFsHost::Observer:
void OnHostDestroyed() override;
void OnUnmounted() override;
void OnFilesChanged(
const std::vector<drivefs::mojom::FileChange>& changes) override;
private:
enum class SearchType {
kLastViewed,
kLastModified,
kSharedWithUser,
};
// Returns a suffix to be used in histogram names when reporting UMA about a
// search request.
static std::string GetHistogramSuffix(SearchType search_type);
// Runs Drive FS search using the provided query parameters.
// `callback` gets run when the search completes. The search results are added
// to `pending_results_`.
void PerformSearch(SearchType search_type,
drivefs::mojom::QueryParametersPtr query,
drive::DriveIntegrationService* drive_service,
base::RepeatingClosure callback);
// Converts items from `query_result_files_by_path_` to a sorted list of file
// suggestions.
std::vector<FileSuggestData> GetSuggestionsFromLatestQueryResults();
// Run upon completion of all Drive FS searches - includes searched for
// recently modified files, and files recently viewd by the user. It
// aggregates results, and runs callbacks waiting for file suggestions.
void OnRecentFilesSearchesCompleted();
// Callback for a single Drive FS search query. Saves the returned results in
// `pending_results_`, and runs `callback`.
void OnSearchRequestComplete(
SearchType search_type,
base::RepeatingClosure callback,
drive::FileError error,
std::optional<std::vector<drivefs::mojom::QueryItemPtr>> items);
const raw_ptr<Profile> profile_;
// The time delta within which a valid file suggestion needs to be viewed or
// modified.
const base::TimeDelta max_recency_;
// Whether request for file suggest data can generate results from the latest
// cached query results.
bool can_use_cache_ = false;
// The callbacks that run when the drive results are ready.
// Using a callback list to handle the edge case that multiple data consumers
// wait for the drive results.
base::OnceCallbackList<GetSuggestFileDataCallback::RunType>
on_drive_results_ready_callback_list_;
// Keeps track of results returned by individual Drive FS searches.
std::map<base::FilePath, drivefs::mojom::FileMetadataPtr>
query_result_files_by_path_;
// Timestamp for when search requests were issued. Used to collect UMA.
base::Time search_start_time_;
// Used to guard the calling to get drive suggestion results.
base::WeakPtrFactory<DriveRecentFileSuggestionProvider> weak_factory_{this};
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_FILE_SUGGEST_DRIVE_RECENT_FILE_SUGGESTION_PROVIDER_H_