// Copyright 2021 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_CHROME_APP_LIST_ITEM_MANAGER_H_
#define CHROME_BROWSER_ASH_APP_LIST_CHROME_APP_LIST_ITEM_MANAGER_H_
#include <map>
#include <string>
#include "ash/public/cpp/app_list/app_list_types.h"
#include "base/memory/raw_ptr.h"
class ChromeAppListItem;
// The class to manage chrome app list items and never talks to Ash.
class ChromeAppListItemManager {
public:
ChromeAppListItemManager();
ChromeAppListItemManager(const ChromeAppListItemManager&) = delete;
ChromeAppListItemManager& operator=(const ChromeAppListItemManager&) = delete;
~ChromeAppListItemManager();
// Methods to find/add/update/remove an item.
ChromeAppListItem* FindItem(const std::string& id);
ChromeAppListItem* AddChromeItem(std::unique_ptr<ChromeAppListItem> app_item);
void UpdateChromeItem(const std::string& id,
std::unique_ptr<ash::AppListItemMetadata>);
void RemoveChromeItem(const std::string& id);
// Implement `ChromeAppListModelUpdater` methods.
size_t ItemCount() const;
int BadgedItemCount() const;
std::vector<ChromeAppListItem*> GetTopLevelItems() const;
// Returns a position that is greater than all valid positions in `items_`.
syncer::StringOrdinal CreateChromePositionOnLast() const;
// Returns the child placed at the end of the specified folder's children
// list. Copy the logic of `AppListItemList::CreatePositionBefore()` when
// the parameter is an invalid position.
// TODO(https://crbug.com/1252437): tune this comment when the app list sync
// code is cleaned.
ChromeAppListItem* FindLastChildInFolder(const std::string& folder_id);
const auto& items() const { return items_; }
private:
friend class ChromeAppListItemManagerTest;
// The methods to update `folder_item_mappings_`.
void AddChildItemToFolderItemMapping(ChromeAppListItem* child_item,
const std::string& dst_folder);
void RemoveChildFromFolderItemMapping(ChromeAppListItem* child_item,
const std::string& src_folder);
// Ensures that `child_item` has valid position before adding to
// `folder_item_mappings_`. `sorted_children` is the target folder's children
// sorted with the increasing position order before adding `child_item`.
// TODO(https://crbug.com/1252437): now this method is duplicate to
// `AppListItemList::EnsureValidItemPosition()`. When the app list sync code
// is cleaned, only this method should be kept.
void EnsureChildItemValidPosition(
ChromeAppListItem* child_item,
const std::vector<raw_ptr<ChromeAppListItem, VectorExperimental>>&
sorted_children);
// Returns the index at which to insert an item in `sorted_children` based on
// `position` (which must be valid) and `id` (if the positions are equal).
// TODO(https://crbug.com/1252437): now this method is duplicate to
// `AppListItemList::GetItemSortOrderIndex()`. When the app list sync code is
// cleaned, only this method should be kept.
size_t GetItemSortOrderIndex(
ChromeAppListItem* child_item,
const std::vector<raw_ptr<ChromeAppListItem, VectorExperimental>>&
sorted_children);
// A map from a `ChromeAppListItem`'s id to its unique pointer. This item set
// matches the one in `AppListModel`.
std::map<std::string, std::unique_ptr<ChromeAppListItem>> items_;
// For a key-value pair, the key is a folder id while the value is a list of
// app list items under the folder indexed by the key. Note that the list
// maintains the item position increasing order.
std::map<std::string,
std::vector<raw_ptr<ChromeAppListItem, VectorExperimental>>>
folder_item_mappings_;
};
#endif // CHROME_BROWSER_ASH_APP_LIST_CHROME_APP_LIST_ITEM_MANAGER_H_