[go: nahoru, domu]

blob: a047433f6382a1fdb16317f3637a02ac979520cb [file] [log] [blame]
// 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_FILE_SUGGEST_KEYED_SERVICE_H_
#define CHROME_BROWSER_ASH_FILE_SUGGEST_FILE_SUGGEST_KEYED_SERVICE_H_
#include <optional>
#include <utility>
#include <vector>
#include "ash/utility/persistent_proto.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "base/types/pass_key.h"
#include "chrome/browser/ash/app_list/search/ranking/removed_results.pb.h"
#include "chrome/browser/ash/file_suggest/file_suggest_util.h"
#include "components/keyed_service/core/keyed_service.h"
class Profile;
namespace app_list {
class RemovedResultsRanker;
class ZeroStateDriveProvider;
} // namespace app_list
namespace ash {
class FileSuggestionProvider;
class LocalFileSuggestionProvider;
struct SearchResultMetadata;
// The keyed service that queries for the file suggestions (for both the drive
// files and local files) and exposes those data to consumers such as app list.
// TODO(https://crbug.com/1356347): move this service to a neutral place rather
// than leaving it under the app list directory.
class FileSuggestKeyedService : public KeyedService {
public:
class Observer : public base::CheckedObserver {
public:
// Called when file suggestions change.
virtual void OnFileSuggestionUpdated(FileSuggestionType type) {}
};
FileSuggestKeyedService(Profile* profile,
PersistentProto<app_list::RemovedResultsProto> proto);
FileSuggestKeyedService(const FileSuggestKeyedService&) = delete;
FileSuggestKeyedService& operator=(const FileSuggestKeyedService&) = delete;
~FileSuggestKeyedService() override;
// Requests to update the item suggest cache. Only used by the zero state
// drive provider. Overridden for tests.
// TODO(https://crbug.com/1356347): Now the app list relies on this service to
// fetch the drive suggestion data. Meanwhile, this service relies on the app
// list to trigger the item cache update. This cyclic dependency could be
// confusing. The service should update the data cache by its own without
// depending on the app list code.
virtual void MaybeUpdateItemSuggestCache(
base::PassKey<app_list::ZeroStateDriveProvider>);
// Queries for the suggested files of the specified type and returns the
// suggested file data, including file paths and suggestion reasons, through
// the callback. The returned suggestions have been filtered by the file
// last modification time. Only the files that have been modified more
// recently than a threshold are returned. Overridden for tests.
virtual void GetSuggestFileData(FileSuggestionType type,
GetSuggestFileDataCallback callback);
// Persists the ids of the suggestions specified by `absolute_file_paths` so
// that the corresponding suggestions are not sent to service clients anymore.
// Also notifies observers of suggestion updates. Overridden for tests.
virtual void RemoveSuggestionsAndNotify(
const std::vector<base::FilePath>& absolute_file_paths);
// Similar to `RemoveSuggestionsAndNotify()` but with the difference that
// the suggestion is specified by a search result. Overridden for tests.
virtual void RemoveSuggestionBySearchResultAndNotify(
const SearchResultMetadata& search_result);
// Used to expose `proto_` to app list so that the app list can query/remove
// non-file result ids from `proto_`.
// TODO(https://crbug.com/1368833): remove this function when the removed file
// results are managed by this service's own proto without reusing the app
// list's.
PersistentProto<app_list::RemovedResultsProto>* GetProto(
base::PassKey<app_list::RemovedResultsRanker>);
// Adds/Removes an observer.
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
// Returns true if the service is ready to provide all types of suggestions.
bool IsReadyForTest() const;
FileSuggestionProvider* drive_file_suggestion_provider_for_test() {
return drive_file_suggestion_provider_.get();
}
LocalFileSuggestionProvider* local_file_suggestion_provider_for_test() {
return local_file_suggestion_provider_.get();
}
protected:
// Called whenever a suggestion provider updates.
void OnSuggestionProviderUpdated(FileSuggestionType type);
// Filters `suggestions` so that the suggestions that were removed before do
// not appear. Then returns the filtered result through `callback`.
void FilterRemovedSuggestions(
GetSuggestFileDataCallback callback,
const std::optional<std::vector<FileSuggestData>>& suggestions);
// Returns whether `proto_` is initialized.
bool IsProtoInitialized() const;
private:
// Called when `proto_` is ready to read.
void OnRemovedSuggestionProtoReady();
// Removes the suggestions specified by type-id pairs.
void RemoveSuggestionsByTypeIdPairs(
const std::vector<std::pair<FileSuggestionType, std::string>>&
type_id_pairs);
// The provider of drive file suggestions.
std::unique_ptr<FileSuggestionProvider> drive_file_suggestion_provider_;
// The provider of local file suggestions.
std::unique_ptr<LocalFileSuggestionProvider> local_file_suggestion_provider_;
base::ObserverList<Observer> observers_;
const raw_ptr<Profile> profile_;
// Used to query/persis the removed result ids. NOTE: `proto_` contains
// non-file ids.
// TODO(https://crbug.com/1368833): `proto_` should only contain file ids
// after this issue gets fixed.
PersistentProto<app_list::RemovedResultsProto> proto_;
base::WeakPtrFactory<FileSuggestKeyedService> weak_factory_{this};
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_FILE_SUGGEST_FILE_SUGGEST_KEYED_SERVICE_H_