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

Side by Side Diff: chrome/browser/ui/ash/chrome_launcher_prefs.cc

Issue 2352353002: Add AppLauncherId wrapper for items shown in shelf (Closed)
Patch Set: Review v10 Created 4 years, 2 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/chrome_launcher_prefs.h" 5 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 25 matching lines...) Expand all
36 namespace { 36 namespace {
37 37
38 // App ID of default pinned apps. 38 // App ID of default pinned apps.
39 const char* kDefaultPinnedApps[] = { 39 const char* kDefaultPinnedApps[] = {
40 extension_misc::kGmailAppId, extension_misc::kGoogleDocAppId, 40 extension_misc::kGmailAppId, extension_misc::kGoogleDocAppId,
41 extension_misc::kYoutubeAppId, ArcSupportHost::kHostAppId}; 41 extension_misc::kYoutubeAppId, ArcSupportHost::kHostAppId};
42 42
43 base::ListValue* CreateDefaultPinnedAppsList() { 43 base::ListValue* CreateDefaultPinnedAppsList() {
44 std::unique_ptr<base::ListValue> apps(new base::ListValue); 44 std::unique_ptr<base::ListValue> apps(new base::ListValue);
45 for (size_t i = 0; i < arraysize(kDefaultPinnedApps); ++i) 45 for (size_t i = 0; i < arraysize(kDefaultPinnedApps); ++i)
46 apps->Append(CreateAppDict(kDefaultPinnedApps[i])); 46 apps->Append(CreateAppDict(AppLauncherId(kDefaultPinnedApps[i])));
47 47
48 return apps.release(); 48 return apps.release();
49 } 49 }
50 50
51 // Returns the preference value for the display with the given |display_id|. 51 // Returns the preference value for the display with the given |display_id|.
52 // The pref value is stored in |local_path| and |path|, but the pref service may 52 // The pref value is stored in |local_path| and |path|, but the pref service may
53 // have per-display preferences and the value can be specified by policy. 53 // have per-display preferences and the value can be specified by policy.
54 // Here is the priority: 54 // Here is the priority:
55 // * A value managed by policy. This is a single value that applies to all 55 // * A value managed by policy. This is a single value that applies to all
56 // displays. 56 // displays.
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 // copied to |local_path|. 200 // copied to |local_path|.
201 void PropagatePrefToLocalIfNotSet( 201 void PropagatePrefToLocalIfNotSet(
202 syncable_prefs::PrefServiceSyncable* pref_service, 202 syncable_prefs::PrefServiceSyncable* pref_service,
203 const char* local_path, 203 const char* local_path,
204 const char* synced_path) { 204 const char* synced_path) {
205 if (!pref_service->FindPreference(local_path)->HasUserSetting()) 205 if (!pref_service->FindPreference(local_path)->HasUserSetting())
206 pref_service->SetString(local_path, pref_service->GetString(synced_path)); 206 pref_service->SetString(local_path, pref_service->GetString(synced_path));
207 } 207 }
208 208
209 struct PinInfo { 209 struct PinInfo {
210 PinInfo(const std::string& app_id, const syncer::StringOrdinal& item_ordinal) 210 PinInfo(const AppLauncherId& app_launcher_id,
211 : app_id(app_id), item_ordinal(item_ordinal) {} 211 const syncer::StringOrdinal& item_ordinal)
212 : app_launcher_id(app_launcher_id), item_ordinal(item_ordinal) {}
212 213
213 std::string app_id; 214 AppLauncherId app_launcher_id;
214 syncer::StringOrdinal item_ordinal; 215 syncer::StringOrdinal item_ordinal;
215 }; 216 };
216 217
217 struct ComparePinInfo { 218 struct ComparePinInfo {
218 bool operator()(const PinInfo& pin1, const PinInfo& pin2) { 219 bool operator()(const PinInfo& pin1, const PinInfo& pin2) {
219 return pin1.item_ordinal.LessThan(pin2.item_ordinal); 220 return pin1.item_ordinal.LessThan(pin2.item_ordinal);
220 } 221 }
221 }; 222 };
222 223
223 // Helper class to keep apps in order of appearance and to provide fast way 224 // Helper class to keep apps in order of appearance and to provide fast way
224 // to check if app exists in the list. 225 // to check if app exists in the list.
225 class AppTracker { 226 class AppTracker {
226 public: 227 public:
227 bool HasApp(const std::string& app_id) const { 228 bool HasApp(const AppLauncherId& app_launcher_id) const {
228 return app_set_.find(app_id) != app_set_.end(); 229 return app_set_.find(app_launcher_id) != app_set_.end();
229 } 230 }
230 231
231 void AddApp(const std::string& app_id) { 232 void AddApp(const AppLauncherId& app_launcher_id) {
232 if (HasApp(app_id)) 233 if (HasApp(app_launcher_id))
233 return; 234 return;
234 app_list_.push_back(app_id); 235 app_list_.push_back(app_launcher_id);
235 app_set_.insert(app_id); 236 app_set_.insert(app_launcher_id);
236 } 237 }
237 238
238 void MaybeAddApp(const std::string& app_id, 239 void MaybeAddApp(const AppLauncherId& app_launcher_id,
239 const LauncherControllerHelper* helper) { 240 const LauncherControllerHelper* helper) {
240 DCHECK_NE(kPinnedAppsPlaceholder, app_id); 241 DCHECK_NE(kPinnedAppsPlaceholder, app_launcher_id.ToString());
241 if (!helper->IsValidIDForCurrentUser(app_id)) 242 if (!helper->IsValidIDForCurrentUser(app_launcher_id.ToString()))
242 return; 243 return;
243 AddApp(app_id); 244 AddApp(app_launcher_id);
244 } 245 }
245 246
246 void MaybeAddAppFromPref(const base::DictionaryValue* app_pref, 247 void MaybeAddAppFromPref(const base::DictionaryValue* app_pref,
247 const LauncherControllerHelper* helper) { 248 const LauncherControllerHelper* helper) {
248 std::string app_id; 249 std::string app_id;
249 if (!app_pref->GetString(kPinnedAppsPrefAppIDPath, &app_id)) { 250 if (!app_pref->GetString(kPinnedAppsPrefAppIDPath, &app_id)) {
250 LOG(ERROR) << "Cannot get app id from app pref entry."; 251 LOG(ERROR) << "Cannot get app id from app pref entry.";
251 return; 252 return;
252 } 253 }
253 254
254 if (app_id == kPinnedAppsPlaceholder) 255 if (app_id == kPinnedAppsPlaceholder)
255 return; 256 return;
256 257
257 bool pinned_by_policy = false; 258 bool pinned_by_policy = false;
258 if (app_pref->GetBoolean(kPinnedAppsPrefPinnedByPolicy, 259 if (app_pref->GetBoolean(kPinnedAppsPrefPinnedByPolicy,
259 &pinned_by_policy) && 260 &pinned_by_policy) &&
260 pinned_by_policy) { 261 pinned_by_policy) {
261 return; 262 return;
262 } 263 }
263 264
264 MaybeAddApp(app_id, helper); 265 MaybeAddApp(AppLauncherId(app_id), helper);
265 } 266 }
266 267
267 const std::vector<std::string>& app_list() const { return app_list_; } 268 const std::vector<AppLauncherId>& app_list() const { return app_list_; }
268 269
269 private: 270 private:
270 std::vector<std::string> app_list_; 271 std::vector<AppLauncherId> app_list_;
271 std::set<std::string> app_set_; 272 std::set<AppLauncherId> app_set_;
272 }; 273 };
273 274
274 } // namespace 275 } // namespace
275 276
276 const char kPinnedAppsPrefAppIDPath[] = "id"; 277 const char kPinnedAppsPrefAppIDPath[] = "id";
277 const char kPinnedAppsPrefPinnedByPolicy[] = "pinned_by_policy"; 278 const char kPinnedAppsPrefPinnedByPolicy[] = "pinned_by_policy";
278 const char kPinnedAppsPlaceholder[] = "AppShelfIDPlaceholder--------"; 279 const char kPinnedAppsPlaceholder[] = "AppShelfIDPlaceholder--------";
279 280
280 const char kShelfAutoHideBehaviorAlways[] = "Always"; 281 const char kShelfAutoHideBehaviorAlways[] = "Always";
281 const char kShelfAutoHideBehaviorNever[] = "Never"; 282 const char kShelfAutoHideBehaviorNever[] = "Never";
282 283
283 const char kShelfAlignmentBottom[] = "Bottom"; 284 const char kShelfAlignmentBottom[] = "Bottom";
284 const char kShelfAlignmentLeft[] = "Left"; 285 const char kShelfAlignmentLeft[] = "Left";
285 const char kShelfAlignmentRight[] = "Right"; 286 const char kShelfAlignmentRight[] = "Right";
286 287
288 AppLauncherId::AppLauncherId(const std::string& app_id,
289 const std::string& launch_id)
290 : app_id_(app_id), launch_id_(launch_id) {
291 DCHECK(!app_id.empty());
292 }
293
294 AppLauncherId::AppLauncherId(const std::string& app_id) : app_id_(app_id) {
295 DCHECK(!app_id.empty());
296 }
297
298 AppLauncherId::AppLauncherId() {}
299
300 AppLauncherId::~AppLauncherId() {}
301
302 std::string AppLauncherId::ToString() const {
303 return app_id_ + launch_id_;
304 }
305
306 bool AppLauncherId::operator<(const AppLauncherId& other) const {
307 return ToString() < other.ToString();
308 }
309
287 void RegisterChromeLauncherUserPrefs( 310 void RegisterChromeLauncherUserPrefs(
288 user_prefs::PrefRegistrySyncable* registry) { 311 user_prefs::PrefRegistrySyncable* registry) {
289 // TODO: If we want to support multiple profiles this will likely need to be 312 // TODO: If we want to support multiple profiles this will likely need to be
290 // pushed to local state and we'll need to track profile per item. 313 // pushed to local state and we'll need to track profile per item.
291 registry->RegisterIntegerPref( 314 registry->RegisterIntegerPref(
292 prefs::kShelfChromeIconIndex, 315 prefs::kShelfChromeIconIndex,
293 0, 316 0,
294 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 317 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
295 registry->RegisterListPref(prefs::kPinnedLauncherApps, 318 registry->RegisterListPref(prefs::kPinnedLauncherApps,
296 CreateDefaultPinnedAppsList(), 319 CreateDefaultPinnedAppsList(),
297 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 320 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
298 registry->RegisterListPref(prefs::kPolicyPinnedLauncherApps); 321 registry->RegisterListPref(prefs::kPolicyPinnedLauncherApps);
299 registry->RegisterStringPref(prefs::kShelfAutoHideBehavior, 322 registry->RegisterStringPref(prefs::kShelfAutoHideBehavior,
300 kShelfAutoHideBehaviorNever, 323 kShelfAutoHideBehaviorNever,
301 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 324 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
302 registry->RegisterStringPref(prefs::kShelfAutoHideBehaviorLocal, 325 registry->RegisterStringPref(prefs::kShelfAutoHideBehaviorLocal,
303 std::string()); 326 std::string());
304 registry->RegisterStringPref(prefs::kShelfAlignment, 327 registry->RegisterStringPref(prefs::kShelfAlignment,
305 kShelfAlignmentBottom, 328 kShelfAlignmentBottom,
306 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 329 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
307 registry->RegisterStringPref(prefs::kShelfAlignmentLocal, std::string()); 330 registry->RegisterStringPref(prefs::kShelfAlignmentLocal, std::string());
308 registry->RegisterDictionaryPref(prefs::kShelfPreferences); 331 registry->RegisterDictionaryPref(prefs::kShelfPreferences);
309 registry->RegisterIntegerPref(prefs::kLogoutDialogDurationMs, 20000); 332 registry->RegisterIntegerPref(prefs::kLogoutDialogDurationMs, 20000);
310 registry->RegisterBooleanPref(prefs::kShowLogoutButtonInTray, false); 333 registry->RegisterBooleanPref(prefs::kShowLogoutButtonInTray, false);
311 } 334 }
312 335
313 std::unique_ptr<base::DictionaryValue> CreateAppDict( 336 std::unique_ptr<base::DictionaryValue> CreateAppDict(
314 const std::string& app_id) { 337 const AppLauncherId& app_launcher_id) {
315 auto app_value = base::MakeUnique<base::DictionaryValue>(); 338 auto app_value = base::MakeUnique<base::DictionaryValue>();
316 app_value->SetString(kPinnedAppsPrefAppIDPath, app_id); 339 app_value->SetString(kPinnedAppsPrefAppIDPath, app_launcher_id.ToString());
317 return app_value; 340 return app_value;
318 } 341 }
319 342
320 ShelfAutoHideBehavior GetShelfAutoHideBehaviorPref(PrefService* prefs, 343 ShelfAutoHideBehavior GetShelfAutoHideBehaviorPref(PrefService* prefs,
321 int64_t display_id) { 344 int64_t display_id) {
322 DCHECK_NE(display_id, display::Display::kInvalidDisplayID); 345 DCHECK_NE(display_id, display::Display::kInvalidDisplayID);
323 346
324 // Don't show the shelf in app mode. 347 // Don't show the shelf in app mode.
325 if (chrome::IsRunningInAppMode()) 348 if (chrome::IsRunningInAppMode())
326 return SHELF_AUTO_HIDE_ALWAYS_HIDDEN; 349 return SHELF_AUTO_HIDE_ALWAYS_HIDDEN;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 if (!arc_app_list_pref) 426 if (!arc_app_list_pref)
404 continue; 427 continue;
405 428
406 // We are dealing with package name, not with 32 characters ID. 429 // We are dealing with package name, not with 32 characters ID.
407 const std::string& arc_package = app_id; 430 const std::string& arc_package = app_id;
408 const std::vector<std::string> activities = GetActivitiesForPackage( 431 const std::vector<std::string> activities = GetActivitiesForPackage(
409 arc_package, all_arc_app_ids, *arc_app_list_pref); 432 arc_package, all_arc_app_ids, *arc_app_list_pref);
410 for (const auto& activity : activities) { 433 for (const auto& activity : activities) {
411 const std::string arc_app_id = 434 const std::string arc_app_id =
412 ArcAppListPrefs::GetAppId(arc_package, activity); 435 ArcAppListPrefs::GetAppId(arc_package, activity);
413 apps->MaybeAddApp(arc_app_id, helper); 436 apps->MaybeAddApp(AppLauncherId(arc_app_id), helper);
414 } 437 }
415 } else { 438 } else {
416 apps->MaybeAddApp(app_id, helper); 439 apps->MaybeAddApp(AppLauncherId(app_id), helper);
417 } 440 }
418 } 441 }
419 } 442 }
420 443
421 std::vector<std::string> GetPinnedAppsFromPrefsLegacy( 444 std::vector<AppLauncherId> GetPinnedAppsFromPrefsLegacy(
422 const PrefService* prefs, 445 const PrefService* prefs,
423 const LauncherControllerHelper* helper) { 446 const LauncherControllerHelper* helper) {
424 // Adding the app list item to the list of items requires that the ID is not 447 // Adding the app list item to the list of items requires that the ID is not
425 // a valid and known ID for the extension system. The ID was constructed that 448 // a valid and known ID for the extension system. The ID was constructed that
426 // way - but just to make sure... 449 // way - but just to make sure...
427 DCHECK(!helper->IsValidIDForCurrentUser(kPinnedAppsPlaceholder)); 450 DCHECK(!helper->IsValidIDForCurrentUser(kPinnedAppsPlaceholder));
428 451
429 const auto* pinned_apps = prefs->GetList(prefs::kPinnedLauncherApps); 452 const auto* pinned_apps = prefs->GetList(prefs::kPinnedLauncherApps);
430 453
431 // Get the sanitized preference value for the index of the Chrome app icon. 454 // Get the sanitized preference value for the index of the Chrome app icon.
432 const size_t chrome_icon_index = std::max<size_t>( 455 const size_t chrome_icon_index = std::max<size_t>(
433 0, std::min<size_t>(pinned_apps->GetSize(), 456 0, std::min<size_t>(pinned_apps->GetSize(),
434 prefs->GetInteger(prefs::kShelfChromeIconIndex))); 457 prefs->GetInteger(prefs::kShelfChromeIconIndex)));
435 458
436 // Check if Chrome is in either of the the preferences lists. 459 // Check if Chrome is in either of the the preferences lists.
437 std::unique_ptr<base::Value> chrome_app( 460 std::unique_ptr<base::Value> chrome_app(
438 CreateAppDict(extension_misc::kChromeAppId)); 461 CreateAppDict(AppLauncherId(extension_misc::kChromeAppId)));
439 462
440 AppTracker apps; 463 AppTracker apps;
441 GetAppsPinnedByPolicy(prefs, helper, &apps); 464 GetAppsPinnedByPolicy(prefs, helper, &apps);
442 465
443 std::string app_id; 466 std::string app_id;
444 for (size_t i = 0; i < pinned_apps->GetSize(); ++i) { 467 for (size_t i = 0; i < pinned_apps->GetSize(); ++i) {
445 // We need to position the chrome icon relative to its place in the pinned 468 // We need to position the chrome icon relative to its place in the pinned
446 // preference list - even if an item of that list isn't shown yet. 469 // preference list - even if an item of that list isn't shown yet.
447 if (i == chrome_icon_index) 470 if (i == chrome_icon_index)
448 apps.AddApp(extension_misc::kChromeAppId); 471 apps.AddApp(AppLauncherId(extension_misc::kChromeAppId));
449 const base::DictionaryValue* app_pref = nullptr; 472 const base::DictionaryValue* app_pref = nullptr;
450 if (!pinned_apps->GetDictionary(i, &app_pref)) { 473 if (!pinned_apps->GetDictionary(i, &app_pref)) {
451 LOG(ERROR) << "There is no dictionary for app entry."; 474 LOG(ERROR) << "There is no dictionary for app entry.";
452 continue; 475 continue;
453 } 476 }
454 apps.MaybeAddAppFromPref(app_pref, helper); 477 apps.MaybeAddAppFromPref(app_pref, helper);
455 } 478 }
456 479
457 // If not added yet, the chrome item will be the last item in the list. 480 // If not added yet, the chrome item will be the last item in the list.
458 apps.AddApp(extension_misc::kChromeAppId); 481 apps.AddApp(AppLauncherId(extension_misc::kChromeAppId));
459 return apps.app_list(); 482 return apps.app_list();
460 } 483 }
461 484
462 // static 485 // static
463 std::unique_ptr<ChromeLauncherPrefsObserver> 486 std::unique_ptr<ChromeLauncherPrefsObserver>
464 ChromeLauncherPrefsObserver::CreateIfNecessary(Profile* profile) { 487 ChromeLauncherPrefsObserver::CreateIfNecessary(Profile* profile) {
465 syncable_prefs::PrefServiceSyncable* prefs = 488 syncable_prefs::PrefServiceSyncable* prefs =
466 PrefServiceSyncableFromProfile(profile); 489 PrefServiceSyncableFromProfile(profile);
467 if (!prefs->FindPreference(prefs::kShelfAlignmentLocal)->HasUserSetting() || 490 if (!prefs->FindPreference(prefs::kShelfAlignmentLocal)->HasUserSetting() ||
468 !prefs->FindPreference(prefs::kShelfAutoHideBehaviorLocal) 491 !prefs->FindPreference(prefs::kShelfAutoHideBehaviorLocal)
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 if (!position.IsValid() || 550 if (!position.IsValid() ||
528 sync_peer.second->item_pin_ordinal.GreaterThan(position)) { 551 sync_peer.second->item_pin_ordinal.GreaterThan(position)) {
529 position = sync_peer.second->item_pin_ordinal; 552 position = sync_peer.second->item_pin_ordinal;
530 } 553 }
531 } 554 }
532 555
533 return position.IsValid() ? position.CreateAfter() 556 return position.IsValid() ? position.CreateAfter()
534 : syncer::StringOrdinal::CreateInitialOrdinal(); 557 : syncer::StringOrdinal::CreateInitialOrdinal();
535 } 558 }
536 559
537 std::vector<std::string> ImportLegacyPinnedApps( 560 std::vector<AppLauncherId> ImportLegacyPinnedApps(
538 const PrefService* prefs, 561 const PrefService* prefs,
539 LauncherControllerHelper* helper, 562 LauncherControllerHelper* helper,
540 const AppTracker& policy_apps) { 563 const AppTracker& policy_apps) {
541 std::vector<std::string> legacy_pins = 564 std::vector<AppLauncherId> legacy_pins =
542 GetPinnedAppsFromPrefsLegacy(prefs, helper); 565 GetPinnedAppsFromPrefsLegacy(prefs, helper);
543 DCHECK(!legacy_pins.empty()); 566 DCHECK(!legacy_pins.empty());
544 567
545 app_list::AppListSyncableService* app_service = 568 app_list::AppListSyncableService* app_service =
546 app_list::AppListSyncableServiceFactory::GetForProfile(helper->profile()); 569 app_list::AppListSyncableServiceFactory::GetForProfile(helper->profile());
547 570
548 syncer::StringOrdinal last_position = 571 syncer::StringOrdinal last_position =
549 syncer::StringOrdinal::CreateInitialOrdinal(); 572 syncer::StringOrdinal::CreateInitialOrdinal();
550 // Convert to sync item record. 573 // Convert to sync item record.
551 for (const auto& app_id : legacy_pins) { 574 for (const auto& app_launcher_id : legacy_pins) {
552 DCHECK_NE(kPinnedAppsPlaceholder, app_id); 575 DCHECK_NE(kPinnedAppsPlaceholder, app_launcher_id.ToString());
553 app_service->SetPinPosition(app_id, last_position); 576 app_service->SetPinPosition(app_launcher_id.ToString(), last_position);
554 last_position = last_position.CreateAfter(); 577 last_position = last_position.CreateAfter();
555 } 578 }
556 579
557 // Now process default apps. 580 // Now process default apps.
558 for (size_t i = 0; i < arraysize(kDefaultPinnedApps); ++i) { 581 for (size_t i = 0; i < arraysize(kDefaultPinnedApps); ++i) {
559 const std::string& app_id = kDefaultPinnedApps[i]; 582 const std::string& app_id = kDefaultPinnedApps[i];
560 // Check if it is already imported. 583 // Check if it is already imported.
561 if (app_service->GetPinPosition(app_id).IsValid()) 584 if (app_service->GetPinPosition(app_id).IsValid())
562 continue; 585 continue;
563 // Check if it is present but not in legacy pin. 586 // Check if it is present but not in legacy pin.
564 if (helper->IsValidIDForCurrentUser(app_id)) 587 if (helper->IsValidIDForCurrentUser(app_id))
565 continue; 588 continue;
566 app_service->SetPinPosition(app_id, last_position); 589 app_service->SetPinPosition(app_id, last_position);
567 last_position = last_position.CreateAfter(); 590 last_position = last_position.CreateAfter();
568 } 591 }
569 592
570 return legacy_pins; 593 return legacy_pins;
571 } 594 }
572 595
573 std::vector<std::string> GetPinnedAppsFromPrefs( 596 std::vector<AppLauncherId> GetPinnedAppsFromPrefs(
574 const PrefService* prefs, 597 const PrefService* prefs,
575 LauncherControllerHelper* helper) { 598 LauncherControllerHelper* helper) {
576 app_list::AppListSyncableService* app_service = 599 app_list::AppListSyncableService* app_service =
577 app_list::AppListSyncableServiceFactory::GetForProfile(helper->profile()); 600 app_list::AppListSyncableServiceFactory::GetForProfile(helper->profile());
578 // Some unit tests may not have it. 601 // Some unit tests may not have it.
579 if (!app_service) 602 if (!app_service)
580 return std::vector<std::string>(); 603 return std::vector<AppLauncherId>();
581 604
582 std::vector<PinInfo> pin_infos; 605 std::vector<PinInfo> pin_infos;
583 606
584 AppTracker policy_apps; 607 AppTracker policy_apps;
585 GetAppsPinnedByPolicy(prefs, helper, &policy_apps); 608 GetAppsPinnedByPolicy(prefs, helper, &policy_apps);
586 609
587 // Empty pins indicates that sync based pin model is used for the first 610 // Empty pins indicates that sync based pin model is used for the first
588 // time. In normal workflow we have at least Chrome browser pin info. 611 // time. In normal workflow we have at least Chrome browser pin info.
589 bool first_run = true; 612 bool first_run = true;
590 613
591 for (const auto& sync_peer : app_service->sync_items()) { 614 for (const auto& sync_peer : app_service->sync_items()) {
592 if (!sync_peer.second->item_pin_ordinal.IsValid()) 615 if (!sync_peer.second->item_pin_ordinal.IsValid())
593 continue; 616 continue;
594 617
595 first_run = false; 618 first_run = false;
596 // Don't include apps that currently do not exist on device. 619 // Don't include apps that currently do not exist on device.
597 if (sync_peer.first != extension_misc::kChromeAppId && 620 if (sync_peer.first != extension_misc::kChromeAppId &&
598 !helper->IsValidIDForCurrentUser(sync_peer.first)) { 621 !helper->IsValidIDForCurrentUser(sync_peer.first)) {
599 continue; 622 continue;
600 } 623 }
601 624
602 pin_infos.push_back( 625 pin_infos.push_back(PinInfo(AppLauncherId(sync_peer.first),
603 PinInfo(sync_peer.first, sync_peer.second->item_pin_ordinal)); 626 sync_peer.second->item_pin_ordinal));
604 } 627 }
605 628
606 if (first_run) { 629 if (first_run) {
607 // We need to import legacy pins model and convert it to sync based 630 // We need to import legacy pins model and convert it to sync based
608 // model. 631 // model.
609 return ImportLegacyPinnedApps(prefs, helper, policy_apps); 632 return ImportLegacyPinnedApps(prefs, helper, policy_apps);
610 } 633 }
611 634
612 // Sort pins according their ordinals. 635 // Sort pins according their ordinals.
613 std::sort(pin_infos.begin(), pin_infos.end(), ComparePinInfo()); 636 std::sort(pin_infos.begin(), pin_infos.end(), ComparePinInfo());
614 637
615 // Pinned by policy apps appear first, if they were not shown before. 638 // Pinned by policy apps appear first, if they were not shown before.
616 syncer::StringOrdinal front_position = GetFirstPinPosition(helper->profile()); 639 syncer::StringOrdinal front_position = GetFirstPinPosition(helper->profile());
617 std::vector<std::string>::const_reverse_iterator it; 640 std::vector<AppLauncherId>::const_reverse_iterator it;
618 for (it = policy_apps.app_list().rbegin(); 641 for (it = policy_apps.app_list().rbegin();
619 it != policy_apps.app_list().rend(); ++it) { 642 it != policy_apps.app_list().rend(); ++it) {
620 const std::string& app_id = *it; 643 const std::string& app_id = (*it).ToString();
621 if (app_id == kPinnedAppsPlaceholder) 644 if (app_id == kPinnedAppsPlaceholder)
622 continue; 645 continue;
623 646
624 // Check if we already processed current app. 647 // Check if we already processed current app.
625 if (app_service->GetPinPosition(app_id).IsValid()) 648 if (app_service->GetPinPosition(app_id).IsValid())
626 continue; 649 continue;
627 650
628 // Now move it to the front. 651 // Now move it to the front.
629 pin_infos.insert(pin_infos.begin(), PinInfo(app_id, front_position)); 652 pin_infos.insert(pin_infos.begin(),
653 PinInfo(AppLauncherId(app_id), front_position));
630 app_service->SetPinPosition(app_id, front_position); 654 app_service->SetPinPosition(app_id, front_position);
631 front_position = front_position.CreateBefore(); 655 front_position = front_position.CreateBefore();
632 } 656 }
633 657
634 // Now insert Chrome browser app if needed. 658 // Now insert Chrome browser app if needed.
635 if (!app_service->GetPinPosition(extension_misc::kChromeAppId).IsValid()) { 659 if (!app_service->GetPinPosition(extension_misc::kChromeAppId).IsValid()) {
636 pin_infos.insert(pin_infos.begin(), 660 pin_infos.insert(
637 PinInfo(extension_misc::kChromeAppId, front_position)); 661 pin_infos.begin(),
662 PinInfo(AppLauncherId(extension_misc::kChromeAppId), front_position));
638 app_service->SetPinPosition(extension_misc::kChromeAppId, front_position); 663 app_service->SetPinPosition(extension_misc::kChromeAppId, front_position);
639 } 664 }
640 665
641 if (helper->IsValidIDForCurrentUser(ArcSupportHost::kHostAppId)) { 666 if (helper->IsValidIDForCurrentUser(ArcSupportHost::kHostAppId)) {
642 if (!app_service->GetSyncItem(ArcSupportHost::kHostAppId)) { 667 if (!app_service->GetSyncItem(ArcSupportHost::kHostAppId)) {
643 const syncer::StringOrdinal arc_host_position = 668 const syncer::StringOrdinal arc_host_position =
644 GetLastPinPosition(helper->profile()); 669 GetLastPinPosition(helper->profile());
645 pin_infos.insert(pin_infos.begin(), 670 pin_infos.insert(pin_infos.begin(),
646 PinInfo(ArcSupportHost::kHostAppId, arc_host_position)); 671 PinInfo(AppLauncherId(ArcSupportHost::kHostAppId),
672 arc_host_position));
647 app_service->SetPinPosition(ArcSupportHost::kHostAppId, 673 app_service->SetPinPosition(ArcSupportHost::kHostAppId,
648 arc_host_position); 674 arc_host_position);
649 } 675 }
650 } 676 }
651 677
652 // Convert to string array. 678 // Convert to AppLauncherId array.
653 std::vector<std::string> pins(pin_infos.size()); 679 std::vector<AppLauncherId> pins(pin_infos.size(), AppLauncherId());
654 for (size_t i = 0; i < pin_infos.size(); ++i) 680 for (size_t i = 0; i < pin_infos.size(); ++i)
655 pins[i] = pin_infos[i].app_id; 681 pins[i] = pin_infos[i].app_launcher_id;
656 682
657 return pins; 683 return pins;
658 } 684 }
659 685
660 void RemovePinPosition(Profile* profile, const std::string& app_id) { 686 void RemovePinPosition(Profile* profile, const AppLauncherId& app_launcher_id) {
661 DCHECK(profile); 687 DCHECK(profile);
662 DCHECK(!app_id.empty());
663 app_list::AppListSyncableService* app_service = 688 app_list::AppListSyncableService* app_service =
664 app_list::AppListSyncableServiceFactory::GetForProfile(profile); 689 app_list::AppListSyncableServiceFactory::GetForProfile(profile);
665 app_service->SetPinPosition(app_id, syncer::StringOrdinal()); 690 app_service->SetPinPosition(app_launcher_id.ToString(),
691 syncer::StringOrdinal());
666 } 692 }
667 693
668 void SetPinPosition(Profile* profile, 694 void SetPinPosition(Profile* profile,
669 const std::string& app_id, 695 const AppLauncherId& app_launcher_id,
670 const std::string& app_id_before, 696 const AppLauncherId& app_launcher_id_before,
671 const std::vector<std::string>& app_ids_after) { 697 const std::vector<AppLauncherId>& app_launcher_ids_after) {
672 DCHECK(profile); 698 DCHECK(profile);
673 DCHECK(!app_id.empty()); 699 const std::string app_launcher_id_str = app_launcher_id.ToString();
674 DCHECK_NE(app_id, app_id_before); 700 const std::string app_launcher_id_before_str =
701 app_launcher_id_before.ToString();
702 DCHECK_NE(app_launcher_id_str, app_launcher_id_before_str);
675 703
676 app_list::AppListSyncableService* app_service = 704 app_list::AppListSyncableService* app_service =
677 app_list::AppListSyncableServiceFactory::GetForProfile(profile); 705 app_list::AppListSyncableServiceFactory::GetForProfile(profile);
678 // Some unit tests may not have this service. 706 // Some unit tests may not have this service.
679 if (!app_service) 707 if (!app_service)
680 return; 708 return;
681 709
682 syncer::StringOrdinal position_before = 710 syncer::StringOrdinal position_before =
683 app_id_before.empty() ? syncer::StringOrdinal() 711 app_launcher_id_before_str.empty()
684 : app_service->GetPinPosition(app_id_before); 712 ? syncer::StringOrdinal()
713 : app_service->GetPinPosition(app_launcher_id_before_str);
685 syncer::StringOrdinal position_after; 714 syncer::StringOrdinal position_after;
686 for (const auto& app_id_after : app_ids_after) { 715 for (const auto& app_launcher_id_after : app_launcher_ids_after) {
687 DCHECK_NE(app_id_after, app_id); 716 const std::string app_launcher_id_after_str =
688 DCHECK_NE(app_id_after, app_id_before); 717 app_launcher_id_after.ToString();
689 syncer::StringOrdinal position = app_service->GetPinPosition(app_id_after); 718 DCHECK_NE(app_launcher_id_after_str, app_launcher_id_str);
719 DCHECK_NE(app_launcher_id_after_str, app_launcher_id_before_str);
720 syncer::StringOrdinal position =
721 app_service->GetPinPosition(app_launcher_id_after_str);
690 DCHECK(position.IsValid()); 722 DCHECK(position.IsValid());
691 if (!position.IsValid()) { 723 if (!position.IsValid()) {
692 LOG(ERROR) << "Sync pin position was not found for " << app_id_after; 724 LOG(ERROR) << "Sync pin position was not found for "
725 << app_launcher_id_after_str;
693 continue; 726 continue;
694 } 727 }
695 if (!position_before.IsValid() || !position.Equals(position_before)) { 728 if (!position_before.IsValid() || !position.Equals(position_before)) {
696 position_after = position; 729 position_after = position;
697 break; 730 break;
698 } 731 }
699 } 732 }
700 733
701 syncer::StringOrdinal pin_position; 734 syncer::StringOrdinal pin_position;
702 if (position_before.IsValid() && position_after.IsValid()) 735 if (position_before.IsValid() && position_after.IsValid())
703 pin_position = position_before.CreateBetween(position_after); 736 pin_position = position_before.CreateBetween(position_after);
704 else if (position_before.IsValid()) 737 else if (position_before.IsValid())
705 pin_position = position_before.CreateAfter(); 738 pin_position = position_before.CreateAfter();
706 else if (position_after.IsValid()) 739 else if (position_after.IsValid())
707 pin_position = position_after.CreateBefore(); 740 pin_position = position_after.CreateBefore();
708 else 741 else
709 pin_position = syncer::StringOrdinal::CreateInitialOrdinal(); 742 pin_position = syncer::StringOrdinal::CreateInitialOrdinal();
710 app_service->SetPinPosition(app_id, pin_position); 743 app_service->SetPinPosition(app_launcher_id_str, pin_position);
711 } 744 }
712 745
713 } // namespace launcher 746 } // namespace launcher
714 } // namespace ash 747 } // namespace ash
OLDNEW
« no previous file with comments | « chrome/browser/ui/ash/chrome_launcher_prefs.h ('k') | chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698