Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(650)

Unified Diff: ash/shelf/shelf_model.cc

Issue 2791463002: mash: Remove ShelfDelegate; move functions to ShelfModel. (Closed)
Patch Set: Address comment. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/shelf/shelf_model.h ('k') | ash/shelf/shelf_model_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « ash/shelf/shelf_model.h ('k') | ash/shelf/shelf_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698