// Copyright 2015 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_APP_LIST_APP_LIST_MODEL_BUILDER_H_
#define CHROME_BROWSER_ASH_APP_LIST_APP_LIST_MODEL_BUILDER_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ash/app_list/app_list_model_updater.h"
#include "chrome/browser/ash/app_list/app_list_syncable_service.h"
#include "components/sync/protocol/app_list_specifics.pb.h"
class AppListControllerDelegate;
class ChromeAppListItem;
class Profile;
// This abstract class populates and maintains the given |model| with
// information from |profile| for the specific item type.
class AppListModelBuilder {
public:
using AppPositionInitCallback =
base::RepeatingCallback<void(ChromeAppListItem*)>;
// Sets and resets the callback to initialize a new app's position in tests.
class ScopedAppPositionInitCallbackForTest {
public:
ScopedAppPositionInitCallbackForTest(AppListModelBuilder* builder,
AppPositionInitCallback callback);
ScopedAppPositionInitCallbackForTest(
const ScopedAppPositionInitCallbackForTest&) = delete;
ScopedAppPositionInitCallbackForTest& operator=(
const ScopedAppPositionInitCallbackForTest) = delete;
~ScopedAppPositionInitCallbackForTest();
private:
const raw_ptr<AppListModelBuilder> builder_;
AppPositionInitCallback callback_;
};
// |controller| is owned by implementation of AppListService.
AppListModelBuilder(AppListControllerDelegate* controller,
const char* item_type);
AppListModelBuilder(const AppListModelBuilder&) = delete;
AppListModelBuilder& operator=(const AppListModelBuilder&) = delete;
virtual ~AppListModelBuilder();
// Initialize to use app-list sync and sets |service_| to |service|.
// |service| is the owner of this instance.
void Initialize(app_list::AppListSyncableService* service,
Profile* profile,
AppListModelUpdater* model_updater);
protected:
// Builds the model with the current profile.
virtual void BuildModel() = 0;
app_list::AppListSyncableService* service() { return service_; }
Profile* profile() { return profile_; }
AppListControllerDelegate* controller() { return controller_; }
AppListModelUpdater* model_updater() { return model_updater_; }
// Inserts an app based on app ordinal prefs.
virtual void InsertApp(std::unique_ptr<ChromeAppListItem> app);
// Removes an app based on app id. If |unsynced_change| is set to true then
// app is removed only from model and sync service is not used.
virtual void RemoveApp(const std::string& id, bool unsynced_change);
// Returns a SyncItem of the specified type if it exists.
const app_list::AppListSyncableService::SyncItem* GetSyncItem(
const std::string& id,
sync_pb::AppListSpecifics::AppListItemType type);
// Returns app instance matching |id| or nullptr.
ChromeAppListItem* GetAppItem(const std::string& id);
private:
// Unowned pointers to the service that owns this and associated profile.
raw_ptr<app_list::AppListSyncableService> service_ = nullptr;
raw_ptr<Profile> profile_ = nullptr;
// Unowned pointer to an app list model updater.
raw_ptr<AppListModelUpdater, DanglingUntriaged> model_updater_ = nullptr;
// Unowned pointer to the app list controller.
raw_ptr<AppListControllerDelegate, DanglingUntriaged> controller_;
// Global constant defined for each item type.
const char* item_type_;
// The callback to initialize an app's position in tests.
raw_ptr<AppPositionInitCallback> position_setter_for_test_ = nullptr;
};
#endif // CHROME_BROWSER_ASH_APP_LIST_APP_LIST_MODEL_BUILDER_H_