#ifndef ASH_APP_LIST_MODEL_APP_LIST_ITEM_H_
#define ASH_APP_LIST_MODEL_APP_LIST_ITEM_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include "ash/app_list/model/app_list_model_export.h"
#include "ash/public/cpp/app_list/app_list_types.h"
#include "ash/public/cpp/shelf_types.h"
#include "base/observer_list.h"
#include "components/sync/model/string_ordinal.h"
#include "ui/gfx/image/image_skia.h"
namespace ash {
enum class AppListConfigType;
class AppListFolderItem;
class AppListTestHelper;
class AppListItemList;
class AppListItemListTest;
class AppListItemObserver;
class AppListModel;
class APP_LIST_MODEL_EXPORT AppListItem {
public:
explicit AppListItem(const std::string& id);
AppListItem(const AppListItem&) = delete;
AppListItem& operator=(const AppListItem&) = delete;
virtual ~AppListItem();
void SetIcon(AppListConfigType config_type, const gfx::ImageSkia& icon);
const gfx::ImageSkia& GetIcon(AppListConfigType config_type) const;
void SetDefaultIconAndColor(const gfx::ImageSkia& icon,
const IconColor& color,
bool is_placeholder_icon);
const gfx::ImageSkia& GetDefaultIcon() const;
const IconColor& GetDefaultIconColor() const;
void SetIconVersion(int icon_version);
const gfx::ImageSkia& GetHostBadgeIcon() const;
void SetHostBadgeIcon(const gfx::ImageSkia bage_icon);
SkColor GetNotificationBadgeColor() const;
void SetNotificationBadgeColor(const SkColor color);
const std::string& GetDisplayName() const { return name(); }
const std::string& GetAccessibleName() {
return accessible_name().empty() ? name() : accessible_name();
}
const std::string& name() const { return metadata_->name; }
const std::string& accessible_name() const {
return metadata_->accessible_name;
}
bool IsInFolder() const { return !folder_id().empty(); }
const std::string& id() const { return metadata_->id; }
const std::string& folder_id() const { return metadata_->folder_id; }
const syncer::StringOrdinal& position() const { return metadata_->position; }
float progress() const { return metadata_->progress; }
void SetProgress(float progress);
void SetMetadata(std::unique_ptr<AppListItemMetadata> metadata) {
metadata_ = std::move(metadata);
}
const AppListItemMetadata* GetMetadata() const { return metadata_.get(); }
std::unique_ptr<AppListItemMetadata> CloneMetadata() const {
return std::make_unique<AppListItemMetadata>(*metadata_);
}
void AddObserver(AppListItemObserver* observer);
void RemoveObserver(AppListItemObserver* observer);
virtual AppListFolderItem* AsFolderItem();
virtual const char* GetItemType() const;
virtual AppListItem* FindChildItem(const std::string& id);
virtual AppListItem* GetChildItemAt(size_t index);
virtual size_t ChildItemCount() const;
virtual void RequestFolderIconUpdate() {}
bool IsFolderFull() const;
std::string ToDebugString() const;
bool is_folder() const { return metadata_->is_folder; }
bool has_notification_badge() const { return has_notification_badge_; }
bool is_new_install() const { return metadata_->is_new_install; }
AppCollection collection_id() const { return metadata_->collection_id; }
void SetIsNewInstall(bool is_new_install);
void SetAppStatus(AppStatus app_status);
AppStatus app_status() const { return metadata_->app_status; }
void UpdateNotificationBadgeForTesting(bool has_badge) {
UpdateNotificationBadge(has_badge);
}
void UpdateAppStatusForTesting(AppStatus app_status) {
metadata_->app_status = app_status;
}
void UpdateAppHostBadgeForTesting(const gfx::ImageSkia fake_badge_icon) {
metadata_->badge_icon = fake_badge_icon;
}
protected:
AppListItemMetadata* metadata() { return metadata_.get(); }
friend class AppsCollectionSectionViewTest;
friend class AppListBadgeController;
friend class AppListTestHelper;
friend class AppListItemList;
friend class AppListItemListTest;
friend class AppListItemViewPixelTestBase;
friend class AppListItemViewPixelTest;
friend class AppListItemViewTest;
friend class AppListModel;
void SetName(const std::string& name);
void SetAccessibleName(const std::string& accessible_name);
void SetAppCollectionId(AppCollection collection_id);
void UpdateNotificationBadge(bool has_badge);
void set_position(const syncer::StringOrdinal& new_position) {
DCHECK(new_position.IsValid());
metadata_->position = new_position;
}
void set_folder_id(const std::string& folder_id) {
metadata_->folder_id = folder_id;
}
void set_is_folder(bool is_folder) { metadata_->is_folder = is_folder; }
private:
friend class AppListModelTest;
FRIEND_TEST_ALL_PREFIXES(AppListItemViewTest, AccessibleDescription);
std::unique_ptr<AppListItemMetadata> metadata_;
std::map<AppListConfigType, gfx::ImageSkia> per_config_icons_;
bool has_notification_badge_ = false;
base::ObserverList<AppListItemObserver> observers_;
};
}
#endif