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.h" | 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 *app_list_icon_added = true; | 215 *app_list_icon_added = true; |
216 pinned_apps->push_back(kAppShelfIdPlaceholder); | 216 pinned_apps->push_back(kAppShelfIdPlaceholder); |
217 } else if (valid_for_current_user) { | 217 } else if (valid_for_current_user) { |
218 // Note: In multi profile scenarios we only want to show pinnable apps | 218 // Note: In multi profile scenarios we only want to show pinnable apps |
219 // here which is correct. Running applications from the other users will | 219 // here which is correct. Running applications from the other users will |
220 // continue to run. So no need for multi profile modifications. | 220 // continue to run. So no need for multi profile modifications. |
221 pinned_apps->push_back(app_id); | 221 pinned_apps->push_back(app_id); |
222 } | 222 } |
223 } | 223 } |
224 | 224 |
| 225 const char* const kPinProhibitedExtensionIds[] = { |
| 226 #if defined(OS_CHROMEOS) |
| 227 "cnbgggchhmkkdmeppjobngjoejnihlei", // Arc Support |
| 228 #endif |
| 229 }; |
| 230 |
| 231 const size_t kPinProhibitedExtensionIdsLength = |
| 232 arraysize(kPinProhibitedExtensionIds); |
| 233 |
225 } // namespace | 234 } // namespace |
226 | 235 |
227 #if defined(OS_CHROMEOS) | 236 #if defined(OS_CHROMEOS) |
228 // A class to get events from ChromeOS when a user gets changed or added. | 237 // A class to get events from ChromeOS when a user gets changed or added. |
229 class ChromeLauncherControllerUserSwitchObserver | 238 class ChromeLauncherControllerUserSwitchObserver |
230 : public user_manager::UserManager::UserSessionStateObserver { | 239 : public user_manager::UserManager::UserSessionStateObserver { |
231 public: | 240 public: |
232 ChromeLauncherControllerUserSwitchObserver( | 241 ChromeLauncherControllerUserSwitchObserver( |
233 ChromeLauncherController* controller) | 242 ChromeLauncherController* controller) |
234 : controller_(controller) { | 243 : controller_(controller) { |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 std::string app_id = iter->second->app_id(); | 505 std::string app_id = iter->second->app_id(); |
497 iter->second = new AppShortcutLauncherItemController(app_id, this); | 506 iter->second = new AppShortcutLauncherItemController(app_id, this); |
498 iter->second->set_shelf_id(id); | 507 iter->second->set_shelf_id(id); |
499 // Existing controller is destroyed and replaced by registering again. | 508 // Existing controller is destroyed and replaced by registering again. |
500 SetShelfItemDelegate(id, iter->second); | 509 SetShelfItemDelegate(id, iter->second); |
501 } else { | 510 } else { |
502 LauncherItemClosed(id); | 511 LauncherItemClosed(id); |
503 } | 512 } |
504 } | 513 } |
505 | 514 |
506 bool ChromeLauncherController::CanPin(const std::string& app_id) { | 515 AppListControllerDelegate::Pinnable ChromeLauncherController::GetPinnable( |
| 516 const std::string& app_id) { |
| 517 for (size_t i = 0; i < kPinProhibitedExtensionIdsLength; ++i) { |
| 518 if (kPinProhibitedExtensionIds[i] == app_id) |
| 519 return AppListControllerDelegate::NO_PIN; |
| 520 } |
| 521 |
507 const base::ListValue* pref = | 522 const base::ListValue* pref = |
508 profile_->GetPrefs()->GetList(prefs::kPolicyPinnedLauncherApps); | 523 profile_->GetPrefs()->GetList(prefs::kPolicyPinnedLauncherApps); |
509 if (!pref) | 524 if (!pref) |
510 return true; | 525 return AppListControllerDelegate::PIN_EDITABLE; |
511 for (size_t index = 0; index < pref->GetSize(); ++index) { | 526 for (size_t index = 0; index < pref->GetSize(); ++index) { |
512 const base::DictionaryValue* app = nullptr; | 527 const base::DictionaryValue* app = nullptr; |
513 std::string the_app_id; | 528 std::string the_app_id; |
514 if (pref->GetDictionary(index, &app) && | 529 if (pref->GetDictionary(index, &app) && |
515 app->GetString(ash::kPinnedAppsPrefAppIDPath, &the_app_id) && | 530 app->GetString(ash::kPinnedAppsPrefAppIDPath, &the_app_id) && |
516 app_id == the_app_id) | 531 app_id == the_app_id) |
517 return false; | 532 return AppListControllerDelegate::PIN_FIXED; |
518 } | 533 } |
519 return true; | 534 return AppListControllerDelegate::PIN_EDITABLE; |
520 } | 535 } |
521 | 536 |
522 void ChromeLauncherController::Pin(ash::ShelfID id) { | 537 void ChromeLauncherController::Pin(ash::ShelfID id) { |
523 DCHECK(HasShelfIDToAppIDMapping(id)); | 538 DCHECK(HasShelfIDToAppIDMapping(id)); |
524 | 539 |
525 int index = model_->ItemIndexByID(id); | 540 int index = model_->ItemIndexByID(id); |
526 DCHECK_GE(index, 0); | 541 DCHECK_GE(index, 0); |
527 | 542 |
528 ash::ShelfItem item = model_->items()[index]; | 543 ash::ShelfItem item = model_->items()[index]; |
529 | 544 |
530 if (item.type == ash::TYPE_PLATFORM_APP || | 545 if (item.type == ash::TYPE_PLATFORM_APP || |
531 item.type == ash::TYPE_WINDOWED_APP) { | 546 item.type == ash::TYPE_WINDOWED_APP) { |
532 item.type = ash::TYPE_APP_SHORTCUT; | 547 item.type = ash::TYPE_APP_SHORTCUT; |
533 model_->Set(index, item); | 548 model_->Set(index, item); |
534 } else if (item.type != ash::TYPE_APP_SHORTCUT) { | 549 } else if (item.type != ash::TYPE_APP_SHORTCUT) { |
535 return; | 550 return; |
536 } | 551 } |
537 | 552 |
538 if (GetLauncherItemController(id)->CanPin()) | 553 if (GetLauncherItemController(id)->CanPin()) |
539 PersistPinnedState(); | 554 PersistPinnedState(); |
540 } | 555 } |
541 | 556 |
542 void ChromeLauncherController::Unpin(ash::ShelfID id) { | 557 void ChromeLauncherController::Unpin(ash::ShelfID id) { |
543 LauncherItemController* controller = GetLauncherItemController(id); | 558 LauncherItemController* controller = GetLauncherItemController(id); |
544 CHECK(controller); | 559 CHECK(controller); |
545 bool can_pin = controller->CanPin(); | 560 const bool can_pin = controller->CanPin(); |
546 | 561 |
547 if (controller->type() == LauncherItemController::TYPE_APP || | 562 if (controller->type() == LauncherItemController::TYPE_APP || |
548 controller->locked()) { | 563 controller->locked()) { |
549 UnpinRunningAppInternal(model_->ItemIndexByID(id)); | 564 UnpinRunningAppInternal(model_->ItemIndexByID(id)); |
550 } else { | 565 } else { |
551 LauncherItemClosed(id); | 566 LauncherItemClosed(id); |
552 } | 567 } |
553 if (can_pin) | 568 if (can_pin) |
554 PersistPinnedState(); | 569 PersistPinnedState(); |
555 } | 570 } |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
784 const std::string& app_id) { | 799 const std::string& app_id) { |
785 int index = model_->ItemIndexByID(GetShelfIDForAppID(app_id)); | 800 int index = model_->ItemIndexByID(GetShelfIDForAppID(app_id)); |
786 if (index < 0) | 801 if (index < 0) |
787 return false; | 802 return false; |
788 | 803 |
789 ash::ShelfItemType type = model_->items()[index].type; | 804 ash::ShelfItemType type = model_->items()[index].type; |
790 return type == ash::TYPE_WINDOWED_APP; | 805 return type == ash::TYPE_WINDOWED_APP; |
791 } | 806 } |
792 | 807 |
793 void ChromeLauncherController::PinAppWithID(const std::string& app_id) { | 808 void ChromeLauncherController::PinAppWithID(const std::string& app_id) { |
794 if (CanPin(app_id)) | 809 if (GetPinnable(app_id) == AppListControllerDelegate::PIN_EDITABLE) |
795 DoPinAppWithID(app_id); | 810 DoPinAppWithID(app_id); |
796 else | 811 else |
797 NOTREACHED(); | 812 NOTREACHED(); |
798 } | 813 } |
799 | 814 |
800 void ChromeLauncherController::SetLaunchType( | 815 void ChromeLauncherController::SetLaunchType( |
801 ash::ShelfID id, | 816 ash::ShelfID id, |
802 extensions::LaunchType launch_type) { | 817 extensions::LaunchType launch_type) { |
803 LauncherItemController* controller = GetLauncherItemController(id); | 818 LauncherItemController* controller = GetLauncherItemController(id); |
804 if (!controller) | 819 if (!controller) |
805 return; | 820 return; |
806 | 821 |
807 extensions::SetLaunchType(profile_, controller->app_id(), launch_type); | 822 extensions::SetLaunchType(profile_, controller->app_id(), launch_type); |
808 } | 823 } |
809 | 824 |
810 void ChromeLauncherController::UnpinAppWithID(const std::string& app_id) { | 825 void ChromeLauncherController::UnpinAppWithID(const std::string& app_id) { |
811 if (CanPin(app_id)) | 826 if (GetPinnable(app_id) == AppListControllerDelegate::PIN_EDITABLE) |
812 DoUnpinAppWithID(app_id); | 827 DoUnpinAppWithID(app_id); |
813 else | 828 else |
814 NOTREACHED(); | 829 NOTREACHED(); |
815 } | 830 } |
816 | 831 |
817 void ChromeLauncherController::OnSetShelfItemDelegate( | 832 void ChromeLauncherController::OnSetShelfItemDelegate( |
818 ash::ShelfID id, | 833 ash::ShelfID id, |
819 ash::ShelfItemDelegate* item_delegate) { | 834 ash::ShelfItemDelegate* item_delegate) { |
820 // TODO(skuhne): This fixes crbug.com/429870, but it does not answer why we | 835 // TODO(skuhne): This fixes crbug.com/429870, but it does not answer why we |
821 // get into this state in the first place. | 836 // get into this state in the first place. |
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1445 if (IsAppPinned(app_id)) | 1460 if (IsAppPinned(app_id)) |
1446 return; | 1461 return; |
1447 | 1462 |
1448 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); | 1463 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); |
1449 if (shelf_id) { | 1464 if (shelf_id) { |
1450 // App item exists, pin it | 1465 // App item exists, pin it |
1451 Pin(shelf_id); | 1466 Pin(shelf_id); |
1452 } else { | 1467 } else { |
1453 // Otherwise, create a shortcut item for it. | 1468 // Otherwise, create a shortcut item for it. |
1454 shelf_id = CreateAppShortcutLauncherItem(app_id, model_->item_count()); | 1469 shelf_id = CreateAppShortcutLauncherItem(app_id, model_->item_count()); |
1455 if (CanPin(app_id)) | 1470 if (GetPinnable(app_id) == AppListControllerDelegate::PIN_EDITABLE) |
1456 PersistPinnedState(); | 1471 PersistPinnedState(); |
1457 } | 1472 } |
1458 } | 1473 } |
1459 | 1474 |
1460 void ChromeLauncherController::DoUnpinAppWithID(const std::string& app_id) { | 1475 void ChromeLauncherController::DoUnpinAppWithID(const std::string& app_id) { |
1461 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); | 1476 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); |
1462 if (shelf_id && IsPinned(shelf_id)) | 1477 if (shelf_id && IsPinned(shelf_id)) |
1463 Unpin(shelf_id); | 1478 Unpin(shelf_id); |
1464 } | 1479 } |
1465 | 1480 |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2063 | 2078 |
2064 AppIconLoader* ChromeLauncherController::GetAppIconLoaderForApp( | 2079 AppIconLoader* ChromeLauncherController::GetAppIconLoaderForApp( |
2065 const std::string& app_id) { | 2080 const std::string& app_id) { |
2066 for (const auto& app_icon_loader : app_icon_loaders_) { | 2081 for (const auto& app_icon_loader : app_icon_loaders_) { |
2067 if (app_icon_loader->CanLoadImageForApp(app_id)) | 2082 if (app_icon_loader->CanLoadImageForApp(app_id)) |
2068 return app_icon_loader.get(); | 2083 return app_icon_loader.get(); |
2069 } | 2084 } |
2070 | 2085 |
2071 return nullptr; | 2086 return nullptr; |
2072 } | 2087 } |
OLD | NEW |