Index: chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
index a2483e545a3a2dd3c7bfcda58f7bfae37e9e31ed..f4c7e83df386ed4a15610eb5a054dc56e80267db 100644 |
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
@@ -253,11 +253,8 @@ ChromeLauncherControllerImpl::ChromeLauncherControllerImpl( |
new ExtensionAppWindowLauncherController(this)); |
} |
app_window_controllers_.push_back(std::move(extension_app_window_controller)); |
- |
- std::unique_ptr<AppWindowLauncherController> arc_app_window_controller; |
- arc_app_window_controller.reset( |
- new ArcAppWindowLauncherController(this, this)); |
- app_window_controllers_.push_back(std::move(arc_app_window_controller)); |
+ app_window_controllers_.push_back( |
+ base::MakeUnique<ArcAppWindowLauncherController>(this)); |
// Right now ash::Shell isn't created for tests. |
// TODO(mukai): Allows it to observe display change and write tests. |
@@ -747,87 +744,32 @@ void ChromeLauncherControllerImpl::AttachProfile(Profile* profile_to_attach) { |
PrefServiceSyncableFromProfile(profile())->AddObserver(this); |
} |
-/////////////////////////////////////////////////////////////////////////////// |
-// ash::ShelfDelegate: |
- |
ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForAppID( |
const std::string& app_id) { |
- // Get shelf id for |app_id| and an empty |launch_id|. |
- return GetShelfIDForAppIDAndLaunchID(app_id, std::string()); |
+ return model_->GetShelfIDForAppID(app_id); |
} |
ash::ShelfID ChromeLauncherControllerImpl::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 = |
- ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); |
- if (shelf_app_id.empty()) |
- return ash::kInvalidShelfID; |
- |
- for (const ash::ShelfItem& item : model_->items()) { |
- // Ash's ShelfWindowWatcher handles app panel windows separately. |
- if (item.type != ash::TYPE_APP_PANEL && |
- item.app_launch_id.app_id() == shelf_app_id && |
- item.app_launch_id.launch_id() == launch_id) { |
- return item.id; |
- } |
- } |
- return ash::kInvalidShelfID; |
+ return model_->GetShelfIDForAppIDAndLaunchID(app_id, launch_id); |
} |
const std::string& ChromeLauncherControllerImpl::GetAppIDForShelfID( |
ash::ShelfID id) { |
- ash::ShelfItems::const_iterator item = model_->ItemByID(id); |
- return item != model_->items().end() ? item->app_launch_id.app_id() |
- : base::EmptyString(); |
+ return model_->GetAppIDForShelfID(id); |
} |
void ChromeLauncherControllerImpl::PinAppWithID(const std::string& app_id) { |
- // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 |
- const std::string shelf_app_id = |
- ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); |
- |
- // Requests to pin should only be be made for apps with editable pin states. |
- DCHECK_EQ(GetPinnableForAppID(shelf_app_id, profile()), |
- AppListControllerDelegate::PIN_EDITABLE); |
- |
- // 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. |
- ash::ShelfID shelf_id = GetShelfIDForAppID(shelf_app_id); |
- if (shelf_id != ash::kInvalidShelfID) { |
- DCHECK_EQ(GetItem(shelf_id)->type, ash::TYPE_APP); |
- DCHECK(!GetItem(shelf_id)->pinned_by_policy); |
- SetItemType(shelf_id, ash::TYPE_PINNED_APP); |
- } else { |
- shelf_id = CreateAppShortcutLauncherItem(ash::AppLaunchId(shelf_app_id), |
- model_->item_count()); |
- } |
+ model_->PinAppWithID(app_id); |
} |
bool ChromeLauncherControllerImpl::IsAppPinned(const std::string& app_id) { |
- // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 |
- const std::string shelf_app_id = |
- ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); |
- |
- return IsPinned(GetShelfIDForAppID(shelf_app_id)); |
+ return model_->IsAppPinned(app_id); |
} |
void ChromeLauncherControllerImpl::UnpinAppWithID(const std::string& app_id) { |
- // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 |
- const std::string shelf_app_id = |
- ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); |
- |
- // Requests to unpin should only be be made for apps with editable pin states. |
- DCHECK_EQ(GetPinnableForAppID(shelf_app_id, profile()), |
- AppListControllerDelegate::PIN_EDITABLE); |
- |
- // If the app is pinned, unpin the shelf item (and remove it if not running). |
- if (IsAppPinned(shelf_app_id)) |
- UnpinShelfItemInternal(GetShelfIDForAppID(shelf_app_id)); |
+ model_->UnpinAppWithID(app_id); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -938,14 +880,8 @@ void ChromeLauncherControllerImpl::RestoreUnpinnedRunningApplicationOrder( |
} |
void ChromeLauncherControllerImpl::RemoveShelfItem(ash::ShelfID id) { |
- const std::string& app_id = GetAppIDForShelfID(id); |
- AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); |
- if (app_icon_loader) |
- app_icon_loader->ClearImage(app_id); |
const int index = model_->ItemIndexByID(id); |
- // A "browser proxy" is not known to the model and this removal does |
- // therefore not need to be propagated to the model. |
- if (index != -1) |
+ if (index >= 0 && index < model_->item_count()) |
model_->RemoveItemAt(index); |
} |
@@ -1163,29 +1099,13 @@ ash::ShelfID ChromeLauncherControllerImpl::InsertAppLauncherItem( |
CHECK(item_delegate); |
// Ash's ShelfWindowWatcher handles app panel windows separately. |
DCHECK_NE(ash::TYPE_APP_PANEL, shelf_item_type); |
- |
ash::ShelfItem item; |
+ item.status = status; |
item.type = shelf_item_type; |
item.app_launch_id = item_delegate->app_launch_id(); |
- item.image = extensions::util::GetDefaultAppIcon(); |
- |
- const std::string& app_id = item_delegate->app_id(); |
- item.title = LauncherControllerHelper::GetAppTitle(profile(), app_id); |
- |
- ash::ShelfItemStatus new_state = GetAppState(app_id); |
- if (new_state != ash::STATUS_CLOSED) |
- status = new_state; |
- |
- item.status = status; |
- model_->AddAt(index, item); |
- |
- AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); |
- if (app_icon_loader) { |
- app_icon_loader->FetchImage(app_id); |
- app_icon_loader->UpdateImage(app_id); |
- } |
- |
+ // Set the delegate first to avoid constructing one in ShelfItemAdded. |
model_->SetShelfItemDelegate(id, std::move(item_delegate)); |
+ model_->AddAt(index, item); |
return id; |
} |
@@ -1202,11 +1122,12 @@ void ChromeLauncherControllerImpl::CreateBrowserShortcutLauncherItem() { |
browser_shortcut.title = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); |
browser_shortcut.app_launch_id = ash::AppLaunchId(kChromeAppId); |
ash::ShelfID id = model_->next_id(); |
- model_->AddAt(0, browser_shortcut); |
std::unique_ptr<BrowserShortcutLauncherItemController> item_delegate = |
base::MakeUnique<BrowserShortcutLauncherItemController>(model_); |
BrowserShortcutLauncherItemController* item_controller = item_delegate.get(); |
+ // Set the delegate first to avoid constructing another one in ShelfItemAdded. |
model_->SetShelfItemDelegate(id, std::move(item_delegate)); |
+ model_->AddAt(0, browser_shortcut); |
item_controller->UpdateBrowserItemState(); |
} |
@@ -1276,24 +1197,69 @@ void ChromeLauncherControllerImpl::ReleaseProfile() { |
void ChromeLauncherControllerImpl::ShelfItemAdded(int index) { |
// Update the pin position preference as needed. |
- const ash::ShelfItem& item = model_->items()[index]; |
+ ash::ShelfItem item = model_->items()[index]; |
if (ItemTypeIsPinned(item) && should_sync_pin_changes()) |
SyncPinPosition(item.id); |
+ |
+ // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 |
+ const std::string shelf_app_id = |
+ ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId( |
+ item.app_launch_id.app_id()); |
+ |
+ // Fetch and update the icon for the app's item. |
+ AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(shelf_app_id); |
+ if (app_icon_loader) { |
+ app_icon_loader->FetchImage(shelf_app_id); |
+ app_icon_loader->UpdateImage(shelf_app_id); |
+ } |
+ |
+ // Update the item with any missing Chrome-specific info. |
+ if (item.type == ash::TYPE_APP || item.type == ash::TYPE_PINNED_APP) { |
+ bool needs_update = false; |
+ if (item.image.isNull()) { |
+ needs_update = true; |
+ item.image = extensions::util::GetDefaultAppIcon(); |
+ } |
+ if (item.title.empty()) { |
+ needs_update = true; |
+ item.title = |
+ LauncherControllerHelper::GetAppTitle(profile(), shelf_app_id); |
+ } |
+ ash::ShelfItemStatus status = GetAppState(shelf_app_id); |
+ if (status != item.status && status != ash::STATUS_CLOSED) { |
+ needs_update = true; |
+ item.status = status; |
+ } |
+ if (needs_update) |
+ model_->Set(index, item); |
+ } |
+ |
+ // Construct a ShelfItemDelegate for the item if one does not yet exist. |
+ if (!model_->GetShelfItemDelegate(item.id)) { |
+ model_->SetShelfItemDelegate( |
+ item.id, AppShortcutLauncherItemController::Create(ash::AppLaunchId( |
+ shelf_app_id, item.app_launch_id.launch_id()))); |
+ } |
} |
void ChromeLauncherControllerImpl::ShelfItemRemoved( |
int index, |
const ash::ShelfItem& old_item) { |
+ // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 |
+ const std::string shelf_app_id = |
+ ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId( |
+ old_item.app_launch_id.app_id()); |
+ |
// Remove the pin position from preferences as needed. |
if (ItemTypeIsPinned(old_item) && should_sync_pin_changes()) { |
- // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 |
- const std::string shelf_app_id = |
- ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId( |
- old_item.app_launch_id.app_id()); |
ash::AppLaunchId app_launch_id(shelf_app_id, |
old_item.app_launch_id.launch_id()); |
ash::launcher::RemovePinPosition(profile(), app_launch_id); |
} |
+ |
+ AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(shelf_app_id); |
+ if (app_icon_loader) |
+ app_icon_loader->ClearImage(shelf_app_id); |
} |
void ChromeLauncherControllerImpl::ShelfItemMoved(int start_index, |