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

Side by Side Diff: chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc

Issue 1921403002: Pin apps from prefs on the mash shelf. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Only use ChromeMashShelfController with use_ash=1. Created 4 years, 7 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 unified diff | Download patch
OLDNEW
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 27 matching lines...) Expand all
38 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h" 38 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
39 #include "chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h " 39 #include "chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h "
40 #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h" 40 #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h"
41 #include "chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h" 41 #include "chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h"
42 #include "chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controll er.h" 42 #include "chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controll er.h"
43 #include "chrome/browser/ui/ash/launcher/browser_status_monitor.h" 43 #include "chrome/browser/ui/ash/launcher/browser_status_monitor.h"
44 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item.h" 44 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item.h"
45 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_browser.h " 45 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_browser.h "
46 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_tab.h" 46 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_tab.h"
47 #include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h" 47 #include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h"
48 #include "chrome/browser/ui/ash/launcher/launcher_app_tab_helper.h" 48 #include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
49 #include "chrome/browser/ui/ash/launcher/launcher_extension_app_updater.h" 49 #include "chrome/browser/ui/ash/launcher/launcher_extension_app_updater.h"
50 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h" 50 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h"
51 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" 51 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
52 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" 52 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
53 #include "chrome/browser/ui/browser.h" 53 #include "chrome/browser/ui/browser.h"
54 #include "chrome/browser/ui/browser_commands.h" 54 #include "chrome/browser/ui/browser_commands.h"
55 #include "chrome/browser/ui/browser_finder.h" 55 #include "chrome/browser/ui/browser_finder.h"
56 #include "chrome/browser/ui/browser_list.h" 56 #include "chrome/browser/ui/browser_list.h"
57 #include "chrome/browser/ui/browser_tabstrip.h" 57 #include "chrome/browser/ui/browser_tabstrip.h"
58 #include "chrome/browser/ui/browser_window.h" 58 #include "chrome/browser/ui/browser_window.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 using extensions::Extension; 110 using extensions::Extension;
111 using extensions::UnloadedExtensionInfo; 111 using extensions::UnloadedExtensionInfo;
112 using extension_misc::kGmailAppId; 112 using extension_misc::kGmailAppId;
113 using content::WebContents; 113 using content::WebContents;
114 114
115 // static 115 // static
116 ChromeLauncherController* ChromeLauncherController::instance_ = NULL; 116 ChromeLauncherController* ChromeLauncherController::instance_ = NULL;
117 117
118 namespace { 118 namespace {
119 119
120 // This will be used as placeholder in the list of the pinned applciatons.
121 // Note that this is NOT a valid extension identifier so that pre M31 versions
122 // will ignore it.
123 const char kAppShelfIdPlaceholder[] = "AppShelfIDPlaceholder--------";
124
125 int64_t GetDisplayIDForShelf(ash::Shelf* shelf) { 120 int64_t GetDisplayIDForShelf(ash::Shelf* shelf) {
126 aura::Window* root_window = 121 aura::Window* root_window =
127 shelf->shelf_widget()->GetNativeWindow()->GetRootWindow(); 122 shelf->shelf_widget()->GetNativeWindow()->GetRootWindow();
128 display::Display display = 123 display::Display display =
129 display::Screen::GetScreen()->GetDisplayNearestWindow(root_window); 124 display::Screen::GetScreen()->GetDisplayNearestWindow(root_window);
130 DCHECK(display.is_valid()); 125 DCHECK(display.is_valid());
131 return display.id(); 126 return display.id();
132 } 127 }
133 128
134 // If prefs have synced and no user-set value exists at |local_path|, the value 129 // If prefs have synced and no user-set value exists at |local_path|, the value
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 // Only pinned by policy, which is not part of user-pinned 191 // Only pinned by policy, which is not part of user-pinned
197 if (app_id == app_id_) 192 if (app_id == app_id_)
198 return false; 193 return false;
199 } 194 }
200 } 195 }
201 } 196 }
202 // Default, user added new pins 197 // Default, user added new pins
203 return true; 198 return true;
204 } 199 }
205 200
206 void update_pinned_apps(const std::string& app_id,
207 bool valid_for_current_user,
208 std::vector<std::string>* pinned_apps,
209 bool* chrome_icon_added,
210 bool* app_list_icon_added) {
211 if (app_id == extension_misc::kChromeAppId) {
212 *chrome_icon_added = true;
213 pinned_apps->push_back(extension_misc::kChromeAppId);
214 } else if (app_id == kAppShelfIdPlaceholder) {
215 *app_list_icon_added = true;
216 pinned_apps->push_back(kAppShelfIdPlaceholder);
217 } else if (valid_for_current_user) {
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
220 // continue to run. So no need for multi profile modifications.
221 pinned_apps->push_back(app_id);
222 }
223 }
224
225 const char* const kPinProhibitedExtensionIds[] = { 201 const char* const kPinProhibitedExtensionIds[] = {
226 #if defined(OS_CHROMEOS) 202 #if defined(OS_CHROMEOS)
227 "cnbgggchhmkkdmeppjobngjoejnihlei", // Arc Support 203 "cnbgggchhmkkdmeppjobngjoejnihlei", // Arc Support
228 #endif 204 #endif
229 }; 205 };
230 206
231 const size_t kPinProhibitedExtensionIdsLength = 207 const size_t kPinProhibitedExtensionIdsLength =
232 arraysize(kPinProhibitedExtensionIds); 208 arraysize(kPinProhibitedExtensionIds);
233 209
234 } // namespace 210 } // namespace
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 if (!IsAppForUserPinned(controller->app_id(), 863 if (!IsAppForUserPinned(controller->app_id(),
888 pinned_apps_pref.get(), 864 pinned_apps_pref.get(),
889 policy_pinned_apps_pref)) 865 policy_pinned_apps_pref))
890 app_value->SetBoolean(ash::kPinnedAppsPrefPinnedByPolicy, true); 866 app_value->SetBoolean(ash::kPinnedAppsPrefPinnedByPolicy, true);
891 updater->Append(app_value); 867 updater->Append(app_value);
892 } 868 }
893 } 869 }
894 } else if (model_->items()[i].type == ash::TYPE_BROWSER_SHORTCUT) { 870 } else if (model_->items()[i].type == ash::TYPE_BROWSER_SHORTCUT) {
895 PersistChromeItemIndex(i); 871 PersistChromeItemIndex(i);
896 } else if (model_->items()[i].type == ash::TYPE_APP_LIST) { 872 } else if (model_->items()[i].type == ash::TYPE_APP_LIST) {
897 base::DictionaryValue* app_value = ash::CreateAppDict( 873 base::DictionaryValue* app_value =
898 kAppShelfIdPlaceholder); 874 ash::CreateAppDict(ash::kPinnedAppsPlaceholder);
899 if (app_value) 875 if (app_value)
900 updater->Append(app_value); 876 updater->Append(app_value);
901 } 877 }
902 } 878 }
903 } 879 }
904 pref_change_registrar_.Add( 880 pref_change_registrar_.Add(
905 prefs::kPinnedLauncherApps, 881 prefs::kPinnedLauncherApps,
906 base::Bind(&ChromeLauncherController::UpdateAppLaunchersFromPref, 882 base::Bind(&ChromeLauncherController::UpdateAppLaunchersFromPref,
907 base::Unretained(this))); 883 base::Unretained(this)));
908 } 884 }
909 885
910 ash::ShelfModel* ChromeLauncherController::model() { 886 ash::ShelfModel* ChromeLauncherController::model() {
911 return model_; 887 return model_;
912 } 888 }
913 889
914 Profile* ChromeLauncherController::profile() { 890 Profile* ChromeLauncherController::profile() {
915 return profile_; 891 return profile_;
916 } 892 }
917 893
918 void ChromeLauncherController::UpdateAppState(content::WebContents* contents, 894 void ChromeLauncherController::UpdateAppState(content::WebContents* contents,
919 AppState app_state) { 895 AppState app_state) {
920 std::string app_id = app_tab_helper_->GetAppID(contents); 896 std::string app_id = launcher_controller_helper_->GetAppID(contents);
921 897
922 // Check if the gMail app is loaded and it matches the given content. 898 // Check if the gMail app is loaded and it matches the given content.
923 // This special treatment is needed to address crbug.com/234268. 899 // This special treatment is needed to address crbug.com/234268.
924 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) 900 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents))
925 app_id = kGmailAppId; 901 app_id = kGmailAppId;
926 902
927 // Check the old |app_id| for a tab. If the contents has changed we need to 903 // Check the old |app_id| for a tab. If the contents has changed we need to
928 // remove it from the previous app. 904 // remove it from the previous app.
929 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) { 905 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) {
930 std::string last_app_id = web_contents_to_app_id_[contents]; 906 std::string last_app_id = web_contents_to_app_id_[contents];
(...skipping 18 matching lines...) Expand all
949 SetItemStatus(id, (app_state == APP_STATE_WINDOW_ACTIVE || 925 SetItemStatus(id, (app_state == APP_STATE_WINDOW_ACTIVE ||
950 app_state == APP_STATE_ACTIVE) ? ash::STATUS_ACTIVE : 926 app_state == APP_STATE_ACTIVE) ? ash::STATUS_ACTIVE :
951 GetAppState(app_id)); 927 GetAppState(app_id));
952 } 928 }
953 } 929 }
954 930
955 ash::ShelfID ChromeLauncherController::GetShelfIDForWebContents( 931 ash::ShelfID ChromeLauncherController::GetShelfIDForWebContents(
956 content::WebContents* contents) { 932 content::WebContents* contents) {
957 DCHECK(contents); 933 DCHECK(contents);
958 934
959 std::string app_id = app_tab_helper_->GetAppID(contents); 935 std::string app_id = launcher_controller_helper_->GetAppID(contents);
960 936
961 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) 937 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents))
962 app_id = kGmailAppId; 938 app_id = kGmailAppId;
963 939
964 ash::ShelfID id = GetShelfIDForAppID(app_id); 940 ash::ShelfID id = GetShelfIDForAppID(app_id);
965 941
966 if (app_id.empty() || !id) { 942 if (app_id.empty() || !id) {
967 int browser_index = model_->GetItemIndexForType(ash::TYPE_BROWSER_SHORTCUT); 943 int browser_index = model_->GetItemIndexForType(ash::TYPE_BROWSER_SHORTCUT);
968 return model_->items()[browser_index].id; 944 return model_->items()[browser_index].id;
969 } 945 }
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
1298 } 1274 }
1299 1275
1300 ash::ShelfID ChromeLauncherController::CreateAppShortcutLauncherItem( 1276 ash::ShelfID ChromeLauncherController::CreateAppShortcutLauncherItem(
1301 const std::string& app_id, 1277 const std::string& app_id,
1302 int index) { 1278 int index) {
1303 return CreateAppShortcutLauncherItemWithType(app_id, 1279 return CreateAppShortcutLauncherItemWithType(app_id,
1304 index, 1280 index,
1305 ash::TYPE_APP_SHORTCUT); 1281 ash::TYPE_APP_SHORTCUT);
1306 } 1282 }
1307 1283
1308 void ChromeLauncherController::SetAppTabHelperForTest(AppTabHelper* helper) { 1284 void ChromeLauncherController::SetLauncherControllerHelperForTest(
1309 app_tab_helper_.reset(helper); 1285 LauncherControllerHelper* helper) {
1286 launcher_controller_helper_.reset(helper);
1310 } 1287 }
1311 1288
1312 void ChromeLauncherController::SetAppIconLoadersForTest( 1289 void ChromeLauncherController::SetAppIconLoadersForTest(
1313 std::vector<std::unique_ptr<AppIconLoader>>& loaders) { 1290 std::vector<std::unique_ptr<AppIconLoader>>& loaders) {
1314 app_icon_loaders_.clear(); 1291 app_icon_loaders_.clear();
1315 for (auto& loader : loaders) 1292 for (auto& loader : loaders)
1316 app_icon_loaders_.push_back(std::move(loader)); 1293 app_icon_loaders_.push_back(std::move(loader));
1317 } 1294 }
1318 1295
1319 const std::string& ChromeLauncherController::GetAppIdFromShelfIdForTest( 1296 const std::string& ChromeLauncherController::GetAppIdFromShelfIdForTest(
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1511 1488
1512 void ChromeLauncherController::UpdateAppLaunchersFromPref() { 1489 void ChromeLauncherController::UpdateAppLaunchersFromPref() {
1513 // There are various functions which will trigger a |PersistPinnedState| call 1490 // There are various functions which will trigger a |PersistPinnedState| call
1514 // like a direct call to |DoPinAppWithID|, or an indirect call to the menu 1491 // like a direct call to |DoPinAppWithID|, or an indirect call to the menu
1515 // model which will use weights to re-arrange the icons to new positions. 1492 // model which will use weights to re-arrange the icons to new positions.
1516 // Since this function is meant to synchronize the "is state" with the 1493 // Since this function is meant to synchronize the "is state" with the
1517 // "sync state", it makes no sense to store any changes by this function back 1494 // "sync state", it makes no sense to store any changes by this function back
1518 // into the pref state. Therefore we tell |persistPinnedState| to ignore any 1495 // into the pref state. Therefore we tell |persistPinnedState| to ignore any
1519 // invocations while we are running. 1496 // invocations while we are running.
1520 base::AutoReset<bool> auto_reset(&ignore_persist_pinned_state_change_, true); 1497 base::AutoReset<bool> auto_reset(&ignore_persist_pinned_state_change_, true);
1521 std::vector<std::string> pinned_apps = GetListOfPinnedAppsAndBrowser(); 1498 std::vector<std::string> pinned_apps = ash::GetPinnedAppsFromPrefs(
1499 profile_->GetPrefs(), launcher_controller_helper_.get());
1522 1500
1523 int index = 0; 1501 int index = 0;
1524 int max_index = model_->item_count(); 1502 int max_index = model_->item_count();
1525 1503
1526 // When one of the two special items cannot be moved (and we do not know where 1504 // When one of the two special items cannot be moved (and we do not know where
1527 // yet), we remember the current location in one of these variables. 1505 // yet), we remember the current location in one of these variables.
1528 int chrome_index = -1; 1506 int chrome_index = -1;
1529 int app_list_index = -1; 1507 int app_list_index = -1;
1530 1508
1531 // Walk the model and |pinned_apps| from the pref lockstep, adding and 1509 // Walk the model and |pinned_apps| from the pref lockstep, adding and
1532 // removing items as necessary. NB: This code uses plain old indexing instead 1510 // removing items as necessary. NB: This code uses plain old indexing instead
1533 // of iterators because of model mutations as part of the loop. 1511 // of iterators because of model mutations as part of the loop.
1534 std::vector<std::string>::const_iterator pref_app_id(pinned_apps.begin()); 1512 std::vector<std::string>::const_iterator pref_app_id(pinned_apps.begin());
1535 for (; index < max_index && pref_app_id != pinned_apps.end(); ++index) { 1513 for (; index < max_index && pref_app_id != pinned_apps.end(); ++index) {
1536 // Check if we have an item which we need to handle. 1514 // Check if we have an item which we need to handle.
1537 if (*pref_app_id == extension_misc::kChromeAppId || 1515 if (*pref_app_id == extension_misc::kChromeAppId ||
1538 *pref_app_id == kAppShelfIdPlaceholder || 1516 *pref_app_id == ash::kPinnedAppsPlaceholder ||
1539 IsAppPinned(*pref_app_id)) { 1517 IsAppPinned(*pref_app_id)) {
1540 for (; index < max_index; ++index) { 1518 for (; index < max_index; ++index) {
1541 const ash::ShelfItem& item(model_->items()[index]); 1519 const ash::ShelfItem& item(model_->items()[index]);
1542 bool is_app_list = item.type == ash::TYPE_APP_LIST; 1520 bool is_app_list = item.type == ash::TYPE_APP_LIST;
1543 bool is_chrome = item.type == ash::TYPE_BROWSER_SHORTCUT; 1521 bool is_chrome = item.type == ash::TYPE_BROWSER_SHORTCUT;
1544 if (item.type != ash::TYPE_APP_SHORTCUT && !is_app_list && !is_chrome) 1522 if (item.type != ash::TYPE_APP_SHORTCUT && !is_app_list && !is_chrome)
1545 continue; 1523 continue;
1546 LauncherItemController* controller = GetLauncherItemController(item.id); 1524 LauncherItemController* controller = GetLauncherItemController(item.id);
1547 if ((kAppShelfIdPlaceholder == *pref_app_id && is_app_list) || 1525 if ((ash::kPinnedAppsPlaceholder == *pref_app_id && is_app_list) ||
1548 (extension_misc::kChromeAppId == *pref_app_id && is_chrome) || 1526 (extension_misc::kChromeAppId == *pref_app_id && is_chrome) ||
1549 (controller && controller->app_id() == *pref_app_id)) { 1527 (controller && controller->app_id() == *pref_app_id)) {
1550 // Check if an item needs to be moved here. 1528 // Check if an item needs to be moved here.
1551 MoveChromeOrApplistToFinalPosition( 1529 MoveChromeOrApplistToFinalPosition(
1552 is_chrome, is_app_list, index, &chrome_index, &app_list_index); 1530 is_chrome, is_app_list, index, &chrome_index, &app_list_index);
1553 ++pref_app_id; 1531 ++pref_app_id;
1554 break; 1532 break;
1555 } else { 1533 } else {
1556 if (is_chrome || is_app_list) { 1534 if (is_chrome || is_app_list) {
1557 // We cannot delete any of these shortcuts. As such we remember 1535 // We cannot delete any of these shortcuts. As such we remember
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1623 else if (item.type == ash::TYPE_APP_LIST) 1601 else if (item.type == ash::TYPE_APP_LIST)
1624 app_list_index = index; 1602 app_list_index = index;
1625 ++index; 1603 ++index;
1626 } 1604 }
1627 } 1605 }
1628 1606
1629 // Append unprocessed items from the pref to the end of the model. 1607 // Append unprocessed items from the pref to the end of the model.
1630 for (; pref_app_id != pinned_apps.end(); ++pref_app_id) { 1608 for (; pref_app_id != pinned_apps.end(); ++pref_app_id) {
1631 // All items but the chrome and / or app list shortcut needs to be added. 1609 // All items but the chrome and / or app list shortcut needs to be added.
1632 bool is_chrome = *pref_app_id == extension_misc::kChromeAppId; 1610 bool is_chrome = *pref_app_id == extension_misc::kChromeAppId;
1633 bool is_app_list = *pref_app_id == kAppShelfIdPlaceholder; 1611 bool is_app_list = *pref_app_id == ash::kPinnedAppsPlaceholder;
1634 // Coming here we know the next item which can be finalized, either the 1612 // Coming here we know the next item which can be finalized, either the
1635 // chrome item or the app launcher. The final position is the end of the 1613 // chrome item or the app launcher. The final position is the end of the
1636 // list. The menu model will make sure that the item is grouped according 1614 // list. The menu model will make sure that the item is grouped according
1637 // to its weight (which we do not know here). 1615 // to its weight (which we do not know here).
1638 if (!is_chrome && !is_app_list) { 1616 if (!is_chrome && !is_app_list) {
1639 DoPinAppWithID(*pref_app_id); 1617 DoPinAppWithID(*pref_app_id);
1640 int target_index = FindInsertionPoint(false); 1618 int target_index = FindInsertionPoint(false);
1641 ash::ShelfID id = GetShelfIDForAppID(*pref_app_id); 1619 ash::ShelfID id = GetShelfIDForAppID(*pref_app_id);
1642 int source_index = model_->ItemIndexByID(id); 1620 int source_index = model_->ItemIndexByID(id);
1643 if (source_index != target_index) 1621 if (source_index != target_index)
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1798 id_to_item_controller_map_[id]->set_shelf_id(id); 1776 id_to_item_controller_map_[id]->set_shelf_id(id);
1799 // ShelfItemDelegateManager owns BrowserShortcutLauncherItemController. 1777 // ShelfItemDelegateManager owns BrowserShortcutLauncherItemController.
1800 SetShelfItemDelegate(id, id_to_item_controller_map_[id]); 1778 SetShelfItemDelegate(id, id_to_item_controller_map_[id]);
1801 return id; 1779 return id;
1802 } 1780 }
1803 1781
1804 void ChromeLauncherController::PersistChromeItemIndex(int index) { 1782 void ChromeLauncherController::PersistChromeItemIndex(int index) {
1805 profile_->GetPrefs()->SetInteger(prefs::kShelfChromeIconIndex, index); 1783 profile_->GetPrefs()->SetInteger(prefs::kShelfChromeIconIndex, index);
1806 } 1784 }
1807 1785
1808 int ChromeLauncherController::GetChromeIconIndexFromPref() const {
1809 size_t index = profile_->GetPrefs()->GetInteger(prefs::kShelfChromeIconIndex);
1810 const base::ListValue* pinned_apps_pref =
1811 profile_->GetPrefs()->GetList(prefs::kPinnedLauncherApps);
1812 return std::max(static_cast<size_t>(0),
1813 std::min(pinned_apps_pref->GetSize(), index));
1814 }
1815
1816 void ChromeLauncherController::MoveChromeOrApplistToFinalPosition( 1786 void ChromeLauncherController::MoveChromeOrApplistToFinalPosition(
1817 bool is_chrome, 1787 bool is_chrome,
1818 bool is_app_list, 1788 bool is_app_list,
1819 int target_index, 1789 int target_index,
1820 int* chrome_index, 1790 int* chrome_index,
1821 int* app_list_index) { 1791 int* app_list_index) {
1822 if (is_chrome && *chrome_index != -1) { 1792 if (is_chrome && *chrome_index != -1) {
1823 model_->Move(*chrome_index, target_index); 1793 model_->Move(*chrome_index, target_index);
1824 if (*app_list_index != -1 && 1794 if (*app_list_index != -1 &&
1825 *chrome_index < *app_list_index && 1795 *chrome_index < *app_list_index &&
(...skipping 25 matching lines...) Expand all
1851 type == ash::TYPE_BROWSER_SHORTCUT) { 1821 type == ash::TYPE_BROWSER_SHORTCUT) {
1852 return i; 1822 return i;
1853 } 1823 }
1854 } 1824 }
1855 return 0; 1825 return 0;
1856 } 1826 }
1857 1827
1858 int ChromeLauncherController::GetChromeIconIndexForCreation() { 1828 int ChromeLauncherController::GetChromeIconIndexForCreation() {
1859 // We get the list of pinned apps as they currently would get pinned. 1829 // We get the list of pinned apps as they currently would get pinned.
1860 // Within this list the chrome icon will be the correct location. 1830 // Within this list the chrome icon will be the correct location.
1861 std::vector<std::string> pinned_apps = GetListOfPinnedAppsAndBrowser(); 1831 std::vector<std::string> pinned_apps = ash::GetPinnedAppsFromPrefs(
1832 profile_->GetPrefs(), launcher_controller_helper_.get());
1862 1833
1863 std::vector<std::string>::iterator it = 1834 std::vector<std::string>::iterator it =
1864 std::find(pinned_apps.begin(), 1835 std::find(pinned_apps.begin(),
1865 pinned_apps.end(), 1836 pinned_apps.end(),
1866 std::string(extension_misc::kChromeAppId)); 1837 std::string(extension_misc::kChromeAppId));
1867 DCHECK(it != pinned_apps.end()); 1838 DCHECK(it != pinned_apps.end());
1868 int index = it - pinned_apps.begin(); 1839 int index = it - pinned_apps.begin();
1869 1840
1870 // We should do here a comparison between the is state and the "want to be" 1841 // We should do here a comparison between the is state and the "want to be"
1871 // state since some apps might be able to pin but are not yet. Instead - for 1842 // state since some apps might be able to pin but are not yet. Instead - for
1872 // the time being we clamp against the amount of known items and wait for the 1843 // the time being we clamp against the amount of known items and wait for the
1873 // next |UpdateAppLaunchersFromPref()| call to correct it - it will come since 1844 // next |UpdateAppLaunchersFromPref()| call to correct it - it will come since
1874 // the pinning will be done then. 1845 // the pinning will be done then.
1875 return std::min(model_->item_count(), index); 1846 return std::min(model_->item_count(), index);
1876 } 1847 }
1877 1848
1878 std::vector<std::string>
1879 ChromeLauncherController::GetListOfPinnedAppsAndBrowser() {
1880 // Adding the app list item to the list of items requires that the ID is not
1881 // a valid and known ID for the extension system. The ID was constructed that
1882 // way - but just to make sure...
1883 DCHECK(!app_tab_helper_->IsValidIDForCurrentUser(kAppShelfIdPlaceholder));
1884
1885 std::vector<std::string> pinned_apps;
1886
1887 // Get the new incarnation of the list.
1888 const base::ListValue* pinned_apps_pref =
1889 profile_->GetPrefs()->GetList(prefs::kPinnedLauncherApps);
1890
1891 const base::ListValue* policy_pinned_apps_pref =
1892 profile_->GetPrefs()->GetList(prefs::kPolicyPinnedLauncherApps);
1893
1894 // Keep track of the addition of the chrome and the app list icon.
1895 bool chrome_icon_added = false;
1896 bool app_list_icon_added = false;
1897 size_t chrome_icon_index = GetChromeIconIndexFromPref();
1898
1899 // See if the chrome string is already in the pinned list and remove it if
1900 // needed.
1901 base::Value* chrome_app = ash::CreateAppDict(extension_misc::kChromeAppId);
1902 if (chrome_app) {
1903 chrome_icon_added = pinned_apps_pref->Find(*chrome_app) !=
1904 pinned_apps_pref->end();
1905 delete chrome_app;
1906 }
1907
1908 if (policy_pinned_apps_pref) {
1909 for (size_t index = 0; index < policy_pinned_apps_pref->GetSize();
1910 ++index) {
1911 const base::DictionaryValue* app = NULL;
1912 std::string app_id;
1913 if (policy_pinned_apps_pref->GetDictionary(index, &app) &&
1914 app->GetString(ash::kPinnedAppsPrefAppIDPath, &app_id) &&
1915 (std::find(pinned_apps.begin(), pinned_apps.end(), app_id) ==
1916 pinned_apps.end()))
1917 update_pinned_apps(
1918 app_id, app_tab_helper_->IsValidIDForCurrentUser(app_id),
1919 &pinned_apps, &chrome_icon_added, &app_list_icon_added);
1920 }
1921 }
1922
1923 for (size_t index = 0; index < pinned_apps_pref->GetSize(); ++index) {
1924 // We need to position the chrome icon relative to it's place in the pinned
1925 // preference list - even if an item of that list isn't shown yet.
1926 if (index == chrome_icon_index && !chrome_icon_added) {
1927 pinned_apps.push_back(extension_misc::kChromeAppId);
1928 chrome_icon_added = true;
1929 }
1930 const base::DictionaryValue* app = NULL;
1931 std::string app_id;
1932 if (pinned_apps_pref->GetDictionary(index, &app) &&
1933 app->GetString(ash::kPinnedAppsPrefAppIDPath, &app_id) &&
1934 (std::find(pinned_apps.begin(), pinned_apps.end(), app_id) ==
1935 pinned_apps.end())) {
1936 bool pinned_by_policy;
1937 if (app->GetBoolean(ash::kPinnedAppsPrefPinnedByPolicy,
1938 &pinned_by_policy) &&
1939 pinned_by_policy) {
1940 continue;
1941 }
1942 update_pinned_apps(
1943 app_id, app_tab_helper_->IsValidIDForCurrentUser(app_id),
1944 &pinned_apps, &chrome_icon_added, &app_list_icon_added);
1945 }
1946 }
1947
1948 // If not added yet, the chrome item will be the last item in the list.
1949 if (!chrome_icon_added)
1950 pinned_apps.push_back(extension_misc::kChromeAppId);
1951
1952 // If not added yet, add the app list item either at the end or at the
1953 // beginning - depending on the shelf layout.
1954 if (!app_list_icon_added) {
1955 pinned_apps.insert(pinned_apps.begin(), kAppShelfIdPlaceholder);
1956 }
1957 return pinned_apps;
1958 }
1959
1960 bool ChromeLauncherController::IsIncognito( 1849 bool ChromeLauncherController::IsIncognito(
1961 const content::WebContents* web_contents) const { 1850 const content::WebContents* web_contents) const {
1962 const Profile* profile = 1851 const Profile* profile =
1963 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 1852 Profile::FromBrowserContext(web_contents->GetBrowserContext());
1964 return profile->IsOffTheRecord() && !profile->IsGuestSession() && 1853 return profile->IsOffTheRecord() && !profile->IsGuestSession() &&
1965 !profile->IsSystemProfile(); 1854 !profile->IsSystemProfile();
1966 } 1855 }
1967 1856
1968 void ChromeLauncherController::CloseWindowedAppsFromRemovedExtension( 1857 void ChromeLauncherController::CloseWindowedAppsFromRemovedExtension(
1969 const std::string& app_id, 1858 const std::string& app_id,
(...skipping 27 matching lines...) Expand all
1997 DCHECK_GT(id, 0); 1886 DCHECK_GT(id, 0);
1998 DCHECK(item_delegate); 1887 DCHECK(item_delegate);
1999 DCHECK(item_delegate_manager_); 1888 DCHECK(item_delegate_manager_);
2000 item_delegate_manager_->SetShelfItemDelegate( 1889 item_delegate_manager_->SetShelfItemDelegate(
2001 id, std::unique_ptr<ash::ShelfItemDelegate>(item_delegate)); 1890 id, std::unique_ptr<ash::ShelfItemDelegate>(item_delegate));
2002 } 1891 }
2003 1892
2004 void ChromeLauncherController::AttachProfile(Profile* profile) { 1893 void ChromeLauncherController::AttachProfile(Profile* profile) {
2005 profile_ = profile; 1894 profile_ = profile;
2006 // Either add the profile to the list of known profiles and make it the active 1895 // Either add the profile to the list of known profiles and make it the active
2007 // one for some functions of AppTabHelper or create a new one. 1896 // one for some functions of LauncherControllerHelper or create a new one.
2008 if (!app_tab_helper_.get()) 1897 if (!launcher_controller_helper_.get())
2009 app_tab_helper_.reset(new LauncherAppTabHelper(profile_)); 1898 launcher_controller_helper_.reset(new LauncherControllerHelper(profile_));
2010 else 1899 else
2011 app_tab_helper_->SetCurrentUser(profile_); 1900 launcher_controller_helper_->SetCurrentUser(profile_);
2012 // TODO(skuhne): The AppIconLoaderImpl has the same problem. Each loaded 1901 // TODO(skuhne): The AppIconLoaderImpl has the same problem. Each loaded
2013 // image is associated with a profile (it's loader requires the profile). 1902 // image is associated with a profile (its loader requires the profile).
2014 // Since icon size changes are possible, the icon could be requested to be 1903 // Since icon size changes are possible, the icon could be requested to be
2015 // reloaded. However - having it not multi profile aware would cause problems 1904 // reloaded. However - having it not multi profile aware would cause problems
2016 // if the icon cache gets deleted upon user switch. 1905 // if the icon cache gets deleted upon user switch.
2017 std::unique_ptr<AppIconLoader> extension_app_icon_loader( 1906 std::unique_ptr<AppIconLoader> extension_app_icon_loader(
2018 new extensions::ExtensionAppIconLoader( 1907 new extensions::ExtensionAppIconLoader(
2019 profile_, extension_misc::EXTENSION_ICON_SMALL, this)); 1908 profile_, extension_misc::EXTENSION_ICON_SMALL, this));
2020 app_icon_loaders_.push_back(std::move(extension_app_icon_loader)); 1909 app_icon_loaders_.push_back(std::move(extension_app_icon_loader));
2021 1910
2022 #if defined(OS_CHROMEOS) 1911 #if defined(OS_CHROMEOS)
2023 std::unique_ptr<AppIconLoader> arc_app_icon_loader(new ArcAppIconLoader( 1912 std::unique_ptr<AppIconLoader> arc_app_icon_loader(new ArcAppIconLoader(
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 1967
2079 AppIconLoader* ChromeLauncherController::GetAppIconLoaderForApp( 1968 AppIconLoader* ChromeLauncherController::GetAppIconLoaderForApp(
2080 const std::string& app_id) { 1969 const std::string& app_id) {
2081 for (const auto& app_icon_loader : app_icon_loaders_) { 1970 for (const auto& app_icon_loader : app_icon_loaders_) {
2082 if (app_icon_loader->CanLoadImageForApp(app_id)) 1971 if (app_icon_loader->CanLoadImageForApp(app_id))
2083 return app_icon_loader.get(); 1972 return app_icon_loader.get();
2084 } 1973 }
2085 1974
2086 return nullptr; 1975 return nullptr;
2087 } 1976 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698