OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h" | 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "ash/common/multi_profile_uma.h" | 11 #include "ash/common/multi_profile_uma.h" |
12 #include "ash/common/shelf/shelf_model.h" | 12 #include "ash/common/shelf/shelf_model.h" |
13 #include "ash/common/shelf/wm_shelf.h" | 13 #include "ash/common/shelf/wm_shelf.h" |
14 #include "ash/common/system/tray/system_tray_delegate.h" | 14 #include "ash/common/system/tray/system_tray_delegate.h" |
15 #include "ash/common/wm_shell.h" | 15 #include "ash/common/wm_shell.h" |
16 #include "ash/common/wm_window.h" | 16 #include "ash/common/wm_window.h" |
| 17 #include "ash/public/cpp/app_launch_id.h" |
17 #include "ash/resources/grit/ash_resources.h" | 18 #include "ash/resources/grit/ash_resources.h" |
18 #include "ash/root_window_controller.h" | 19 #include "ash/root_window_controller.h" |
19 #include "ash/shell.h" | 20 #include "ash/shell.h" |
20 #include "ash/strings/grit/ash_strings.h" | 21 #include "ash/strings/grit/ash_strings.h" |
21 #include "ash/wm/window_util.h" | 22 #include "ash/wm/window_util.h" |
22 #include "base/command_line.h" | 23 #include "base/command_line.h" |
23 #include "base/macros.h" | 24 #include "base/macros.h" |
24 #include "base/strings/pattern.h" | 25 #include "base/strings/pattern.h" |
25 #include "base/strings/string_util.h" | 26 #include "base/strings/string_util.h" |
26 #include "base/strings/utf_string_conversions.h" | 27 #include "base/strings/utf_string_conversions.h" |
27 #include "base/threading/thread_task_runner_handle.h" | 28 #include "base/threading/thread_task_runner_handle.h" |
28 #include "base/values.h" | 29 #include "base/values.h" |
29 #include "build/build_config.h" | 30 #include "build/build_config.h" |
30 #include "chrome/browser/browser_process.h" | 31 #include "chrome/browser/browser_process.h" |
31 #include "chrome/browser/chrome_notification_types.h" | 32 #include "chrome/browser/chrome_notification_types.h" |
32 #include "chrome/browser/chromeos/arc/arc_util.h" | 33 #include "chrome/browser/chromeos/arc/arc_util.h" |
33 #include "chrome/browser/defaults.h" | 34 #include "chrome/browser/defaults.h" |
34 #include "chrome/browser/extensions/extension_util.h" | 35 #include "chrome/browser/extensions/extension_util.h" |
35 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 36 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
36 #include "chrome/browser/prefs/pref_service_syncable_util.h" | 37 #include "chrome/browser/prefs/pref_service_syncable_util.h" |
37 #include "chrome/browser/profiles/profile.h" | 38 #include "chrome/browser/profiles/profile.h" |
38 #include "chrome/browser/profiles/profile_manager.h" | 39 #include "chrome/browser/profiles/profile_manager.h" |
39 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h" | 40 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h" |
40 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" | 41 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" |
41 #include "chrome/browser/ui/ash/app_launcher_id.h" | |
42 #include "chrome/browser/ui/ash/app_sync_ui_state.h" | 42 #include "chrome/browser/ui/ash/app_sync_ui_state.h" |
43 #include "chrome/browser/ui/ash/chrome_shell_delegate.h" | 43 #include "chrome/browser/ui/ash/chrome_shell_delegate.h" |
44 #include "chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h
" | 44 #include "chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h
" |
45 #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" | 45 #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" |
46 #include "chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h" | 46 #include "chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h" |
47 #include "chrome/browser/ui/ash/launcher/arc_app_deferred_launcher_controller.h" | 47 #include "chrome/browser/ui/ash/launcher/arc_app_deferred_launcher_controller.h" |
48 #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h" | 48 #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h" |
49 #include "chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controll
er.h" | 49 #include "chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controll
er.h" |
50 #include "chrome/browser/ui/ash/launcher/browser_status_monitor.h" | 50 #include "chrome/browser/ui/ash/launcher/browser_status_monitor.h" |
51 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h" | 51 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h" |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 } | 367 } |
368 | 368 |
369 void ChromeLauncherControllerImpl::UnpinAndUpdatePrefs(ash::ShelfID id, | 369 void ChromeLauncherControllerImpl::UnpinAndUpdatePrefs(ash::ShelfID id, |
370 bool update_prefs) { | 370 bool update_prefs) { |
371 LauncherItemController* controller = GetLauncherItemController(id); | 371 LauncherItemController* controller = GetLauncherItemController(id); |
372 CHECK(controller); | 372 CHECK(controller); |
373 | 373 |
374 if (update_prefs) { | 374 if (update_prefs) { |
375 ash::launcher::RemovePinPosition( | 375 ash::launcher::RemovePinPosition( |
376 profile(), | 376 profile(), |
377 ash::AppLauncherId(GetAppIDForShelfID(id), GetLaunchIDForShelfID(id))); | 377 ash::AppLaunchId(GetAppIDForShelfID(id), GetLaunchIDForShelfID(id))); |
378 } | 378 } |
379 | 379 |
380 const ash::ShelfItem* item = GetItem(id); | 380 const ash::ShelfItem* item = GetItem(id); |
381 if (item && (item->status != ash::STATUS_CLOSED || controller->locked())) | 381 if (item && (item->status != ash::STATUS_CLOSED || controller->locked())) |
382 UnpinRunningAppInternal(model_->ItemIndexByID(id)); | 382 UnpinRunningAppInternal(model_->ItemIndexByID(id)); |
383 else | 383 else |
384 LauncherItemClosed(id); | 384 LauncherItemClosed(id); |
385 } | 385 } |
386 | 386 |
387 bool ChromeLauncherControllerImpl::IsPinned(ash::ShelfID id) { | 387 bool ChromeLauncherControllerImpl::IsPinned(ash::ShelfID id) { |
388 const ash::ShelfItem* item = GetItem(id); | 388 const ash::ShelfItem* item = GetItem(id); |
389 return item && (item->type == ash::TYPE_PINNED_APP || | 389 return item && (item->type == ash::TYPE_PINNED_APP || |
390 item->type == ash::TYPE_BROWSER_SHORTCUT); | 390 item->type == ash::TYPE_BROWSER_SHORTCUT); |
391 } | 391 } |
392 | 392 |
393 void ChromeLauncherControllerImpl::TogglePinned(ash::ShelfID id) { | 393 void ChromeLauncherControllerImpl::TogglePinned(ash::ShelfID id) { |
394 if (!HasShelfIDToAppIDMapping(id)) | 394 if (!HasShelfIDToAppIDMapping(id)) |
395 return; // May happen if item closed with menu open. | 395 return; // May happen if item closed with menu open. |
396 | 396 |
397 if (IsPinned(id)) | 397 if (IsPinned(id)) |
398 Unpin(id); | 398 Unpin(id); |
399 else | 399 else |
400 Pin(id); | 400 Pin(id); |
401 } | 401 } |
402 | 402 |
403 void ChromeLauncherControllerImpl::LockV1AppWithID(const std::string& app_id) { | 403 void ChromeLauncherControllerImpl::LockV1AppWithID(const std::string& app_id) { |
404 ash::ShelfID id = GetShelfIDForAppID(app_id); | 404 ash::ShelfID id = GetShelfIDForAppID(app_id); |
405 if (id == ash::kInvalidShelfID) { | 405 if (id == ash::kInvalidShelfID) { |
406 CreateAppShortcutLauncherItemWithType(ash::AppLauncherId(app_id), | 406 CreateAppShortcutLauncherItemWithType(ash::AppLaunchId(app_id), |
407 model_->item_count(), ash::TYPE_APP); | 407 model_->item_count(), ash::TYPE_APP); |
408 id = GetShelfIDForAppID(app_id); | 408 id = GetShelfIDForAppID(app_id); |
409 } | 409 } |
410 CHECK(id); | 410 CHECK(id); |
411 GetLauncherItemController(id)->lock(); | 411 GetLauncherItemController(id)->lock(); |
412 } | 412 } |
413 | 413 |
414 void ChromeLauncherControllerImpl::UnlockV1AppWithID( | 414 void ChromeLauncherControllerImpl::UnlockV1AppWithID( |
415 const std::string& app_id) { | 415 const std::string& app_id) { |
416 ash::ShelfID id = GetShelfIDForAppID(app_id); | 416 ash::ShelfID id = GetShelfIDForAppID(app_id); |
417 CHECK_NE(id, ash::kInvalidShelfID); | 417 CHECK_NE(id, ash::kInvalidShelfID); |
418 LauncherItemController* controller = GetLauncherItemController(id); | 418 LauncherItemController* controller = GetLauncherItemController(id); |
419 controller->unlock(); | 419 controller->unlock(); |
420 if (!controller->locked() && !IsPinned(id)) | 420 if (!controller->locked() && !IsPinned(id)) |
421 CloseLauncherItem(id); | 421 CloseLauncherItem(id); |
422 } | 422 } |
423 | 423 |
424 void ChromeLauncherControllerImpl::Launch(ash::ShelfID id, int event_flags) { | 424 void ChromeLauncherControllerImpl::Launch(ash::ShelfID id, int event_flags) { |
425 LauncherItemController* controller = GetLauncherItemController(id); | 425 LauncherItemController* controller = GetLauncherItemController(id); |
426 if (!controller) | 426 if (!controller) |
427 return; // In case invoked from menu and item closed while menu up. | 427 return; // In case invoked from menu and item closed while menu up. |
428 | 428 |
429 // Launching some items replaces the associated item controller instance, | 429 // Launching some items replaces the associated item controller instance, |
430 // which destroys the app and launch id strings; making copies avoid crashes. | 430 // which destroys the app and launch id strings; making copies avoid crashes. |
431 LaunchApp(ash::AppLauncherId(controller->app_id(), controller->launch_id()), | 431 LaunchApp(ash::AppLaunchId(controller->app_id(), controller->launch_id()), |
432 ash::LAUNCH_FROM_UNKNOWN, event_flags); | 432 ash::LAUNCH_FROM_UNKNOWN, event_flags); |
433 } | 433 } |
434 | 434 |
435 void ChromeLauncherControllerImpl::Close(ash::ShelfID id) { | 435 void ChromeLauncherControllerImpl::Close(ash::ShelfID id) { |
436 ash::mojom::ShelfItemDelegate* delegate = model_->GetShelfItemDelegate(id); | 436 ash::mojom::ShelfItemDelegate* delegate = model_->GetShelfItemDelegate(id); |
437 if (!delegate) | 437 if (!delegate) |
438 return; // May happen if menu closed. | 438 return; // May happen if menu closed. |
439 delegate->Close(); | 439 delegate->Close(); |
440 } | 440 } |
441 | 441 |
(...skipping 23 matching lines...) Expand all Loading... |
465 return; | 465 return; |
466 } | 466 } |
467 | 467 |
468 // Create a temporary application launcher item and use it to see if there are | 468 // Create a temporary application launcher item and use it to see if there are |
469 // running instances. | 469 // running instances. |
470 std::unique_ptr<AppShortcutLauncherItemController> controller( | 470 std::unique_ptr<AppShortcutLauncherItemController> controller( |
471 AppShortcutLauncherItemController::Create(app_id, std::string(), this)); | 471 AppShortcutLauncherItemController::Create(app_id, std::string(), this)); |
472 if (!controller->GetRunningApplications().empty()) | 472 if (!controller->GetRunningApplications().empty()) |
473 SelectItemWithSource(controller.get(), source); | 473 SelectItemWithSource(controller.get(), source); |
474 else | 474 else |
475 LaunchApp(ash::AppLauncherId(app_id), source, event_flags); | 475 LaunchApp(ash::AppLaunchId(app_id), source, event_flags); |
476 } | 476 } |
477 | 477 |
478 void ChromeLauncherControllerImpl::SetLauncherItemImage( | 478 void ChromeLauncherControllerImpl::SetLauncherItemImage( |
479 ash::ShelfID shelf_id, | 479 ash::ShelfID shelf_id, |
480 const gfx::ImageSkia& image) { | 480 const gfx::ImageSkia& image) { |
481 const ash::ShelfItem* item = GetItem(shelf_id); | 481 const ash::ShelfItem* item = GetItem(shelf_id); |
482 if (item) { | 482 if (item) { |
483 ash::ShelfItem new_item = *item; | 483 ash::ShelfItem new_item = *item; |
484 new_item.image = image; | 484 new_item.image = image; |
485 model_->Set(model_->ItemIndexByID(shelf_id), new_item); | 485 model_->Set(model_->ItemIndexByID(shelf_id), new_item); |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 | 956 |
957 // TODO(sky): update unit test so that this test isn't necessary. | 957 // TODO(sky): update unit test so that this test isn't necessary. |
958 if (ash::Shell::HasInstance()) | 958 if (ash::Shell::HasInstance()) |
959 SetVirtualKeyboardBehaviorFromPrefs(); | 959 SetVirtualKeyboardBehaviorFromPrefs(); |
960 | 960 |
961 prefs_observer_ = | 961 prefs_observer_ = |
962 ash::launcher::ChromeLauncherPrefsObserver::CreateIfNecessary(profile()); | 962 ash::launcher::ChromeLauncherPrefsObserver::CreateIfNecessary(profile()); |
963 } | 963 } |
964 | 964 |
965 ash::ShelfID ChromeLauncherControllerImpl::CreateAppShortcutLauncherItem( | 965 ash::ShelfID ChromeLauncherControllerImpl::CreateAppShortcutLauncherItem( |
966 const ash::AppLauncherId& app_launcher_id, | 966 const ash::AppLaunchId& app_launch_id, |
967 int index) { | 967 int index) { |
968 return CreateAppShortcutLauncherItemWithType(app_launcher_id, index, | 968 return CreateAppShortcutLauncherItemWithType(app_launch_id, index, |
969 ash::TYPE_PINNED_APP); | 969 ash::TYPE_PINNED_APP); |
970 } | 970 } |
971 | 971 |
972 /////////////////////////////////////////////////////////////////////////////// | 972 /////////////////////////////////////////////////////////////////////////////// |
973 // ChromeLauncherControllerImpl private: | 973 // ChromeLauncherControllerImpl private: |
974 | 974 |
975 void ChromeLauncherControllerImpl::RememberUnpinnedRunningApplicationOrder() { | 975 void ChromeLauncherControllerImpl::RememberUnpinnedRunningApplicationOrder() { |
976 RunningAppListIds list; | 976 RunningAppListIds list; |
977 for (int i = 0; i < model_->item_count(); i++) { | 977 for (int i = 0; i < model_->item_count(); i++) { |
978 if (model_->items()[i].type == ash::TYPE_APP) | 978 if (model_->items()[i].type == ash::TYPE_APP) |
(...skipping 20 matching lines...) Expand all Loading... |
999 DCHECK_GE(app_index, 0); | 999 DCHECK_GE(app_index, 0); |
1000 if (running_index != app_index) | 1000 if (running_index != app_index) |
1001 model_->Move(running_index, app_index); | 1001 model_->Move(running_index, app_index); |
1002 running_index++; | 1002 running_index++; |
1003 } | 1003 } |
1004 } | 1004 } |
1005 } | 1005 } |
1006 | 1006 |
1007 ash::ShelfID | 1007 ash::ShelfID |
1008 ChromeLauncherControllerImpl::CreateAppShortcutLauncherItemWithType( | 1008 ChromeLauncherControllerImpl::CreateAppShortcutLauncherItemWithType( |
1009 const ash::AppLauncherId& app_launcher_id, | 1009 const ash::AppLaunchId& app_launch_id, |
1010 int index, | 1010 int index, |
1011 ash::ShelfItemType shelf_item_type) { | 1011 ash::ShelfItemType shelf_item_type) { |
1012 AppShortcutLauncherItemController* controller = | 1012 AppShortcutLauncherItemController* controller = |
1013 AppShortcutLauncherItemController::Create( | 1013 AppShortcutLauncherItemController::Create( |
1014 app_launcher_id.app_id(), app_launcher_id.launch_id(), this); | 1014 app_launch_id.app_id(), app_launch_id.launch_id(), this); |
1015 ash::ShelfID shelf_id = | 1015 ash::ShelfID shelf_id = |
1016 InsertAppLauncherItem(controller, app_launcher_id.app_id(), | 1016 InsertAppLauncherItem(controller, app_launch_id.app_id(), |
1017 ash::STATUS_CLOSED, index, shelf_item_type); | 1017 ash::STATUS_CLOSED, index, shelf_item_type); |
1018 return shelf_id; | 1018 return shelf_id; |
1019 } | 1019 } |
1020 | 1020 |
1021 void ChromeLauncherControllerImpl::LauncherItemClosed(ash::ShelfID id) { | 1021 void ChromeLauncherControllerImpl::LauncherItemClosed(ash::ShelfID id) { |
1022 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 1022 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
1023 CHECK(iter != id_to_item_controller_map_.end()); | 1023 CHECK(iter != id_to_item_controller_map_.end()); |
1024 CHECK(iter->second); | 1024 CHECK(iter->second); |
1025 const std::string& app_id = iter->second->app_id(); | 1025 const std::string& app_id = iter->second->app_id(); |
1026 AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); | 1026 AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); |
(...skipping 11 matching lines...) Expand all Loading... |
1038 // If there is an item, do nothing and return. | 1038 // If there is an item, do nothing and return. |
1039 if (IsAppPinned(app_id)) | 1039 if (IsAppPinned(app_id)) |
1040 return; | 1040 return; |
1041 | 1041 |
1042 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); | 1042 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); |
1043 if (shelf_id) { | 1043 if (shelf_id) { |
1044 // App item exists, pin it | 1044 // App item exists, pin it |
1045 Pin(shelf_id); | 1045 Pin(shelf_id); |
1046 } else { | 1046 } else { |
1047 // Otherwise, create a shortcut item for it. | 1047 // Otherwise, create a shortcut item for it. |
1048 shelf_id = CreateAppShortcutLauncherItem(ash::AppLauncherId(app_id), | 1048 shelf_id = CreateAppShortcutLauncherItem(ash::AppLaunchId(app_id), |
1049 model_->item_count()); | 1049 model_->item_count()); |
1050 SyncPinPosition(shelf_id); | 1050 SyncPinPosition(shelf_id); |
1051 } | 1051 } |
1052 } | 1052 } |
1053 | 1053 |
1054 void ChromeLauncherControllerImpl::DoUnpinAppWithID(const std::string& app_id, | 1054 void ChromeLauncherControllerImpl::DoUnpinAppWithID(const std::string& app_id, |
1055 bool update_prefs) { | 1055 bool update_prefs) { |
1056 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); | 1056 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); |
1057 if (shelf_id && IsPinned(shelf_id)) | 1057 if (shelf_id && IsPinned(shelf_id)) |
1058 UnpinAndUpdatePrefs(shelf_id, update_prefs); | 1058 UnpinAndUpdatePrefs(shelf_id, update_prefs); |
(...skipping 26 matching lines...) Expand all Loading... |
1085 const int max_index = model_->item_count(); | 1085 const int max_index = model_->item_count(); |
1086 const int index = model_->ItemIndexByID(shelf_id); | 1086 const int index = model_->ItemIndexByID(shelf_id); |
1087 DCHECK_GT(index, 0); | 1087 DCHECK_GT(index, 0); |
1088 | 1088 |
1089 const std::string& app_id = GetAppIDForShelfID(shelf_id); | 1089 const std::string& app_id = GetAppIDForShelfID(shelf_id); |
1090 DCHECK(!app_id.empty()); | 1090 DCHECK(!app_id.empty()); |
1091 const std::string& launch_id = GetLaunchIDForShelfID(shelf_id); | 1091 const std::string& launch_id = GetLaunchIDForShelfID(shelf_id); |
1092 | 1092 |
1093 std::string app_id_before; | 1093 std::string app_id_before; |
1094 std::string launch_id_before; | 1094 std::string launch_id_before; |
1095 std::vector<ash::AppLauncherId> app_launcher_ids_after; | 1095 std::vector<ash::AppLaunchId> app_launch_ids_after; |
1096 | 1096 |
1097 for (int i = index - 1; i > 0; --i) { | 1097 for (int i = index - 1; i > 0; --i) { |
1098 const ash::ShelfID shelf_id_before = model_->items()[i].id; | 1098 const ash::ShelfID shelf_id_before = model_->items()[i].id; |
1099 if (IsPinned(shelf_id_before)) { | 1099 if (IsPinned(shelf_id_before)) { |
1100 app_id_before = GetAppIDForShelfID(shelf_id_before); | 1100 app_id_before = GetAppIDForShelfID(shelf_id_before); |
1101 DCHECK(!app_id_before.empty()); | 1101 DCHECK(!app_id_before.empty()); |
1102 launch_id_before = GetLaunchIDForShelfID(shelf_id_before); | 1102 launch_id_before = GetLaunchIDForShelfID(shelf_id_before); |
1103 break; | 1103 break; |
1104 } | 1104 } |
1105 } | 1105 } |
1106 | 1106 |
1107 for (int i = index + 1; i < max_index; ++i) { | 1107 for (int i = index + 1; i < max_index; ++i) { |
1108 const ash::ShelfID shelf_id_after = model_->items()[i].id; | 1108 const ash::ShelfID shelf_id_after = model_->items()[i].id; |
1109 if (IsPinned(shelf_id_after)) { | 1109 if (IsPinned(shelf_id_after)) { |
1110 const std::string app_id_after = GetAppIDForShelfID(shelf_id_after); | 1110 const std::string app_id_after = GetAppIDForShelfID(shelf_id_after); |
1111 DCHECK(!app_id_after.empty()); | 1111 DCHECK(!app_id_after.empty()); |
1112 const std::string launch_id_after = GetLaunchIDForShelfID(shelf_id_after); | 1112 const std::string launch_id_after = GetLaunchIDForShelfID(shelf_id_after); |
1113 app_launcher_ids_after.push_back( | 1113 app_launch_ids_after.push_back( |
1114 ash::AppLauncherId(app_id_after, launch_id_after)); | 1114 ash::AppLaunchId(app_id_after, launch_id_after)); |
1115 } | 1115 } |
1116 } | 1116 } |
1117 | 1117 |
1118 ash::AppLauncherId app_launcher_id_before = | 1118 ash::AppLaunchId app_launch_id_before = |
1119 app_id_before.empty() | 1119 app_id_before.empty() ? ash::AppLaunchId() |
1120 ? ash::AppLauncherId() | 1120 : ash::AppLaunchId(app_id_before, launch_id_before); |
1121 : ash::AppLauncherId(app_id_before, launch_id_before); | |
1122 | 1121 |
1123 ash::launcher::SetPinPosition(profile(), | 1122 ash::launcher::SetPinPosition(profile(), ash::AppLaunchId(app_id, launch_id), |
1124 ash::AppLauncherId(app_id, launch_id), | 1123 app_launch_id_before, app_launch_ids_after); |
1125 app_launcher_id_before, app_launcher_ids_after); | |
1126 } | 1124 } |
1127 | 1125 |
1128 void ChromeLauncherControllerImpl::OnSyncModelUpdated() { | 1126 void ChromeLauncherControllerImpl::OnSyncModelUpdated() { |
1129 UpdateAppLaunchersFromPref(); | 1127 UpdateAppLaunchersFromPref(); |
1130 } | 1128 } |
1131 | 1129 |
1132 void ChromeLauncherControllerImpl::OnIsSyncingChanged() { | 1130 void ChromeLauncherControllerImpl::OnIsSyncingChanged() { |
1133 UpdateAppLaunchersFromPref(); | 1131 UpdateAppLaunchersFromPref(); |
1134 } | 1132 } |
1135 | 1133 |
1136 void ChromeLauncherControllerImpl::ScheduleUpdateAppLaunchersFromPref() { | 1134 void ChromeLauncherControllerImpl::ScheduleUpdateAppLaunchersFromPref() { |
1137 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1135 base::ThreadTaskRunnerHandle::Get()->PostTask( |
1138 FROM_HERE, | 1136 FROM_HERE, |
1139 base::Bind(&ChromeLauncherControllerImpl::UpdateAppLaunchersFromPref, | 1137 base::Bind(&ChromeLauncherControllerImpl::UpdateAppLaunchersFromPref, |
1140 weak_ptr_factory_.GetWeakPtr())); | 1138 weak_ptr_factory_.GetWeakPtr())); |
1141 } | 1139 } |
1142 | 1140 |
1143 void ChromeLauncherControllerImpl::UpdateAppLaunchersFromPref() { | 1141 void ChromeLauncherControllerImpl::UpdateAppLaunchersFromPref() { |
1144 // There are various functions which will trigger a |SyncPinPosition| call | 1142 // There are various functions which will trigger a |SyncPinPosition| call |
1145 // like a direct call to |DoPinAppWithID|, or an indirect call to the menu | 1143 // like a direct call to |DoPinAppWithID|, or an indirect call to the menu |
1146 // model which will use weights to re-arrange the icons to new positions. | 1144 // model which will use weights to re-arrange the icons to new positions. |
1147 // Since this function is meant to synchronize the "is state" with the | 1145 // Since this function is meant to synchronize the "is state" with the |
1148 // "sync state", it makes no sense to store any changes by this function back | 1146 // "sync state", it makes no sense to store any changes by this function back |
1149 // into the pref state. Therefore we tell |persistPinnedState| to ignore any | 1147 // into the pref state. Therefore we tell |persistPinnedState| to ignore any |
1150 // invocations while we are running. | 1148 // invocations while we are running. |
1151 base::AutoReset<bool> auto_reset(&ignore_persist_pinned_state_change_, true); | 1149 base::AutoReset<bool> auto_reset(&ignore_persist_pinned_state_change_, true); |
1152 const std::vector<ash::AppLauncherId> pinned_apps = | 1150 const std::vector<ash::AppLaunchId> pinned_apps = |
1153 ash::launcher::GetPinnedAppsFromPrefs(profile()->GetPrefs(), | 1151 ash::launcher::GetPinnedAppsFromPrefs(profile()->GetPrefs(), |
1154 launcher_controller_helper()); | 1152 launcher_controller_helper()); |
1155 | 1153 |
1156 int index = 0; | 1154 int index = 0; |
1157 // Skip app list items if it exists. | 1155 // Skip app list items if it exists. |
1158 if (model_->items()[0].type == ash::TYPE_APP_LIST) | 1156 if (model_->items()[0].type == ash::TYPE_APP_LIST) |
1159 ++index; | 1157 ++index; |
1160 | 1158 |
1161 // Apply pins in two steps. At the first step, go through the list of apps to | 1159 // Apply pins in two steps. At the first step, go through the list of apps to |
1162 // pin, move existing pin to current position specified by |index| or create | 1160 // pin, move existing pin to current position specified by |index| or create |
1163 // the new pin at that position. | 1161 // the new pin at that position. |
1164 for (const auto& pref_app_launcher_id : pinned_apps) { | 1162 for (const auto& pref_app_launch_id : pinned_apps) { |
1165 // Filter out apps that may be mapped wrongly. | 1163 // Filter out apps that may be mapped wrongly. |
1166 // TODO(khmel): b/31703859 is to refactore shelf mapping. | 1164 // TODO(khmel): b/31703859 is to refactore shelf mapping. |
1167 const std::string app_id = pref_app_launcher_id.app_id(); | 1165 const std::string app_id = pref_app_launch_id.app_id(); |
1168 const std::string shelf_app_id = | 1166 const std::string shelf_app_id = |
1169 ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); | 1167 ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); |
1170 if (shelf_app_id != app_id) | 1168 if (shelf_app_id != app_id) |
1171 continue; | 1169 continue; |
1172 | 1170 |
1173 // Update apps icon if applicable. | 1171 // Update apps icon if applicable. |
1174 OnAppUpdated(profile(), app_id); | 1172 OnAppUpdated(profile(), app_id); |
1175 | 1173 |
1176 // Find existing pin or app from the right of current |index|. | 1174 // Find existing pin or app from the right of current |index|. |
1177 int app_index = index; | 1175 int app_index = index; |
1178 for (; app_index < model_->item_count(); ++app_index) { | 1176 for (; app_index < model_->item_count(); ++app_index) { |
1179 const ash::ShelfItem& item = model_->items()[app_index]; | 1177 const ash::ShelfItem& item = model_->items()[app_index]; |
1180 const IDToItemControllerMap::iterator it = | 1178 const IDToItemControllerMap::iterator it = |
1181 id_to_item_controller_map_.find(item.id); | 1179 id_to_item_controller_map_.find(item.id); |
1182 if (it != id_to_item_controller_map_.end() && | 1180 if (it != id_to_item_controller_map_.end() && |
1183 it->second->app_id() == app_id && | 1181 it->second->app_id() == app_id && |
1184 it->second->launch_id() == pref_app_launcher_id.launch_id()) { | 1182 it->second->launch_id() == pref_app_launch_id.launch_id()) { |
1185 break; | 1183 break; |
1186 } | 1184 } |
1187 } | 1185 } |
1188 if (app_index < model_->item_count()) { | 1186 if (app_index < model_->item_count()) { |
1189 // Found existing pin or running app. | 1187 // Found existing pin or running app. |
1190 const ash::ShelfItem item = model_->items()[app_index]; | 1188 const ash::ShelfItem item = model_->items()[app_index]; |
1191 if (item.type == ash::TYPE_PINNED_APP || | 1189 if (item.type == ash::TYPE_PINNED_APP || |
1192 item.type == ash::TYPE_BROWSER_SHORTCUT) { | 1190 item.type == ash::TYPE_BROWSER_SHORTCUT) { |
1193 // Just move to required position or keep it inplace. | 1191 // Just move to required position or keep it inplace. |
1194 model_->Move(app_index, index); | 1192 model_->Move(app_index, index); |
1195 } else { | 1193 } else { |
1196 PinRunningAppInternal(index, item.id); | 1194 PinRunningAppInternal(index, item.id); |
1197 } | 1195 } |
1198 DCHECK_EQ(model_->ItemIndexByID(item.id), index); | 1196 DCHECK_EQ(model_->ItemIndexByID(item.id), index); |
1199 } else { | 1197 } else { |
1200 // This is fresh pin. Create new one. | 1198 // This is fresh pin. Create new one. |
1201 DCHECK_NE(app_id, extension_misc::kChromeAppId); | 1199 DCHECK_NE(app_id, extension_misc::kChromeAppId); |
1202 CreateAppShortcutLauncherItem(pref_app_launcher_id, index); | 1200 CreateAppShortcutLauncherItem(pref_app_launch_id, index); |
1203 } | 1201 } |
1204 ++index; | 1202 ++index; |
1205 } | 1203 } |
1206 | 1204 |
1207 // At second step remove any pin to the right from the current index. | 1205 // At second step remove any pin to the right from the current index. |
1208 while (index < model_->item_count()) { | 1206 while (index < model_->item_count()) { |
1209 const ash::ShelfItem item = model_->items()[index]; | 1207 const ash::ShelfItem item = model_->items()[index]; |
1210 if (item.type != ash::TYPE_PINNED_APP) { | 1208 if (item.type != ash::TYPE_PINNED_APP) { |
1211 ++index; | 1209 ++index; |
1212 continue; | 1210 continue; |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1499 LauncherItemController* controller = GetLauncherItemController(item.id); | 1497 LauncherItemController* controller = GetLauncherItemController(item.id); |
1500 if (!controller || controller->image_set_by_controller()) | 1498 if (!controller || controller->image_set_by_controller()) |
1501 continue; | 1499 continue; |
1502 item.image = image; | 1500 item.image = image; |
1503 if (arc_deferred_launcher_) | 1501 if (arc_deferred_launcher_) |
1504 arc_deferred_launcher_->MaybeApplySpinningEffect(id, &item.image); | 1502 arc_deferred_launcher_->MaybeApplySpinningEffect(id, &item.image); |
1505 model_->Set(index, item); | 1503 model_->Set(index, item); |
1506 // It's possible we're waiting on more than one item, so don't break. | 1504 // It's possible we're waiting on more than one item, so don't break. |
1507 } | 1505 } |
1508 } | 1506 } |
OLD | NEW |