| Index: ash/shelf/shelf_model.cc
|
| diff --git a/ash/shelf/shelf_model.cc b/ash/shelf/shelf_model.cc
|
| index bfc37d2a261edb7c3030df0a9c5a6ff6ee9cab2b..afd6e1259d929ab5c0903b902580330178a900f0 100644
|
| --- a/ash/shelf/shelf_model.cc
|
| +++ b/ash/shelf/shelf_model.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include <algorithm>
|
|
|
| +#include "ash/public/cpp/app_launch_id.h"
|
| #include "ash/public/cpp/shelf_item_delegate.h"
|
| #include "ash/shelf/shelf_model_observer.h"
|
|
|
| @@ -41,12 +42,117 @@ bool CompareByWeight(const ShelfItem& a, const ShelfItem& b) {
|
| return ShelfItemTypeToWeight(a.type) < ShelfItemTypeToWeight(b.type);
|
| }
|
|
|
| +// Returns shelf app id. Play Store app is mapped to ARC platform host app.
|
| +// TODO(khmel): Fix this Arc application id mapping. See http://b/31703859
|
| +std::string GetShelfAppIdFromArcAppId(const std::string& arc_app_id) {
|
| + static const char kPlayStoreAppId[] = "gpkmicpkkebkmabiaedjognfppcchdfa";
|
| + static const char kArcHostAppId[] = "cnbgggchhmkkdmeppjobngjoejnihlei";
|
| + return arc_app_id == kPlayStoreAppId ? kArcHostAppId : arc_app_id;
|
| +}
|
| +
|
| } // namespace
|
|
|
| ShelfModel::ShelfModel() : next_id_(1) {}
|
|
|
| ShelfModel::~ShelfModel() {}
|
|
|
| +ShelfID ShelfModel::GetShelfIDForAppID(const std::string& app_id) {
|
| + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859
|
| + const std::string shelf_app_id = GetShelfAppIdFromArcAppId(app_id);
|
| +
|
| + if (shelf_app_id.empty())
|
| + return ash::kInvalidShelfID;
|
| +
|
| + for (const ShelfItem& item : items_) {
|
| + // ShelfWindowWatcher handles app panel windows separately.
|
| + if (item.type != TYPE_APP_PANEL &&
|
| + item.app_launch_id.app_id() == shelf_app_id) {
|
| + return item.id;
|
| + }
|
| + }
|
| + return kInvalidShelfID;
|
| +}
|
| +
|
| +ShelfID ShelfModel::GetShelfIDForAppIDAndLaunchID(
|
| + const std::string& app_id,
|
| + const std::string& launch_id) {
|
| + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859
|
| + const std::string shelf_app_id = GetShelfAppIdFromArcAppId(app_id);
|
| +
|
| + if (shelf_app_id.empty())
|
| + return ash::kInvalidShelfID;
|
| +
|
| + for (const ShelfItem& item : items_) {
|
| + // ShelfWindowWatcher handles app panel windows separately.
|
| + if (item.type != TYPE_APP_PANEL &&
|
| + item.app_launch_id.app_id() == shelf_app_id &&
|
| + item.app_launch_id.launch_id() == launch_id) {
|
| + return item.id;
|
| + }
|
| + }
|
| + return kInvalidShelfID;
|
| +}
|
| +
|
| +const std::string& ShelfModel::GetAppIDForShelfID(ShelfID id) {
|
| + ShelfItems::const_iterator item = ItemByID(id);
|
| + return item != items().end() ? item->app_launch_id.app_id()
|
| + : base::EmptyString();
|
| +}
|
| +
|
| +void ShelfModel::PinAppWithID(const std::string& app_id) {
|
| + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859
|
| + const std::string shelf_app_id = GetShelfAppIdFromArcAppId(app_id);
|
| +
|
| + // If the app is already pinned, do nothing and return.
|
| + if (IsAppPinned(shelf_app_id))
|
| + return;
|
| +
|
| + // Convert an existing item to be pinned, or create a new pinned item.
|
| + const int index = ItemIndexByID(GetShelfIDForAppID(shelf_app_id));
|
| + if (index >= 0) {
|
| + ShelfItem item = items_[index];
|
| + DCHECK_EQ(item.type, TYPE_APP);
|
| + DCHECK(!item.pinned_by_policy);
|
| + item.type = TYPE_PINNED_APP;
|
| + Set(index, item);
|
| + } else if (!shelf_app_id.empty()) {
|
| + ash::ShelfItem item;
|
| + item.type = ash::TYPE_PINNED_APP;
|
| + item.app_launch_id = AppLaunchId(shelf_app_id);
|
| + Add(item);
|
| + }
|
| +}
|
| +
|
| +bool ShelfModel::IsAppPinned(const std::string& app_id) {
|
| + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859
|
| + const std::string shelf_app_id = GetShelfAppIdFromArcAppId(app_id);
|
| +
|
| + const int index = ItemIndexByID(GetShelfIDForAppID(shelf_app_id));
|
| + return index >= 0 && (items_[index].type == TYPE_PINNED_APP ||
|
| + items_[index].type == TYPE_BROWSER_SHORTCUT);
|
| +}
|
| +
|
| +void ShelfModel::UnpinAppWithID(const std::string& app_id) {
|
| + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859
|
| + const std::string shelf_app_id = GetShelfAppIdFromArcAppId(app_id);
|
| +
|
| + // If the app is already not pinned, do nothing and return.
|
| + if (!IsAppPinned(shelf_app_id))
|
| + return;
|
| +
|
| + // Remove the item if it is closed, or mark it as unpinned.
|
| + const int index = ItemIndexByID(GetShelfIDForAppID(shelf_app_id));
|
| + ShelfItem item = items_[index];
|
| + DCHECK_EQ(item.type, TYPE_PINNED_APP);
|
| + DCHECK(!item.pinned_by_policy);
|
| + if (item.status == ash::STATUS_CLOSED) {
|
| + RemoveItemAt(index);
|
| + } else {
|
| + item.type = TYPE_APP;
|
| + Set(index, item);
|
| + }
|
| +}
|
| +
|
| void ShelfModel::DestroyItemDelegates() {
|
| // Some ShelfItemDelegates access this model in their destructors and hence
|
| // need early cleanup.
|
|
|