Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 659 DCHECK(profile); | 659 DCHECK(profile); |
| 660 DCHECK(!app_id.empty()); | 660 DCHECK(!app_id.empty()); |
| 661 app_list::AppListSyncableService* app_service = | 661 app_list::AppListSyncableService* app_service = |
| 662 app_list::AppListSyncableServiceFactory::GetForProfile(profile); | 662 app_list::AppListSyncableServiceFactory::GetForProfile(profile); |
| 663 app_service->SetPinPosition(app_id, syncer::StringOrdinal()); | 663 app_service->SetPinPosition(app_id, syncer::StringOrdinal()); |
| 664 } | 664 } |
| 665 | 665 |
| 666 void SetPinPosition(Profile* profile, | 666 void SetPinPosition(Profile* profile, |
| 667 const std::string& app_id, | 667 const std::string& app_id, |
| 668 const std::string& app_id_before, | 668 const std::string& app_id_before, |
| 669 const std::string& app_id_after) { | 669 const std::vector<std::string>& app_ids_after) { |
| 670 DCHECK(profile); | 670 DCHECK(profile); |
| 671 DCHECK(!app_id.empty()); | 671 DCHECK(!app_id.empty()); |
| 672 DCHECK_NE(app_id, app_id_before); | 672 DCHECK_NE(app_id, app_id_before); |
| 673 const std::string app_id_after = | |
| 674 app_ids_after.empty() ? std::string() : app_ids_after.front(); | |
| 673 DCHECK_NE(app_id, app_id_after); | 675 DCHECK_NE(app_id, app_id_after); |
| 674 DCHECK(app_id_before.empty() || app_id_before != app_id_after); | 676 DCHECK(app_id_before.empty() || app_id_before != app_id_after); |
|
stevenjb
2016/09/23 23:05:01
Elim app_id_after and the checks from here and mov
khmel
2016/09/26 16:43:36
Done.
| |
| 675 | 677 |
| 676 app_list::AppListSyncableService* app_service = | 678 app_list::AppListSyncableService* app_service = |
| 677 app_list::AppListSyncableServiceFactory::GetForProfile(profile); | 679 app_list::AppListSyncableServiceFactory::GetForProfile(profile); |
| 678 // Some unit tests may not have this service. | 680 // Some unit tests may not have this service. |
| 679 if (!app_service) | 681 if (!app_service) |
| 680 return; | 682 return; |
| 681 | 683 |
| 682 syncer::StringOrdinal position_before = | 684 syncer::StringOrdinal position_before = |
| 683 app_id_before.empty() ? syncer::StringOrdinal() | 685 app_id_before.empty() ? syncer::StringOrdinal() |
| 684 : app_service->GetPinPosition(app_id_before); | 686 : app_service->GetPinPosition(app_id_before); |
| 685 syncer::StringOrdinal position_after = | 687 syncer::StringOrdinal position_after = syncer::StringOrdinal(); |
| 686 app_id_after.empty() ? syncer::StringOrdinal() | 688 if (position_before.IsValid() && !app_ids_after.empty()) { |
| 687 : app_service->GetPinPosition(app_id_after); | 689 // We have an element before and at least one after. Find the first element |
| 690 // from after elements that differs from position_before. | |
| 691 std::vector<syncer::StringOrdinal> positions_after; | |
| 692 for (const auto& app_id_after_it : app_ids_after) { | |
| 693 syncer::StringOrdinal position = | |
| 694 app_service->GetPinPosition(app_id_after_it); | |
| 695 if (!position.IsValid()) { | |
| 696 NOTREACHED(); | |
| 697 break; | |
| 698 } | |
| 699 positions_after.push_back(position); | |
| 700 if (!position_before.Equals(position)) { | |
| 701 DCHECK(position_before.LessThan(position)); | |
| 702 break; | |
| 703 } | |
| 704 } | |
| 705 if (!positions_after.empty()) { | |
| 706 if (positions_after[0].Equals(position_before)) { | |
| 707 size_t index = positions_after.size() - 1; | |
| 708 if (positions_after[index].Equals(position_before)) { | |
| 709 // Last after element is still the same as before element. Update it. | |
| 710 positions_after[index] = position_before.CreateAfter(); | |
| 711 app_service->SetPinPosition(app_ids_after[index], | |
| 712 positions_after[index]); | |
| 713 } | |
| 714 // Now update the rest of after elements. | |
| 715 while (index) { | |
| 716 --index; | |
| 717 DCHECK(positions_after[index].Equals(position_before)); | |
| 718 positions_after[index] = | |
| 719 position_before.CreateBetween(positions_after[index + 1]); | |
| 720 app_service->SetPinPosition(app_ids_after[index], | |
| 721 positions_after[index]); | |
| 722 } | |
| 723 } | |
| 724 position_after = positions_after[0]; | |
| 725 DCHECK(position_after.GreaterThan(position_before)); | |
| 726 } | |
|
stevenjb
2016/09/23 23:05:01
I think this is more complicated than necessary. A
khmel
2016/09/26 16:43:36
My initial intention was to implemented something
stevenjb
2016/09/26 17:34:07
Acknowledged. While I agree that is less than idea
| |
| 727 } else { | |
| 728 // No before or after position. | |
| 729 if (!app_id_after.empty()) | |
|
stevenjb
2016/09/23 23:05:01
} else if (!app_ids_after.empty()) {
string app_
khmel
2016/09/26 16:43:36
Done.
| |
| 730 position_after = app_service->GetPinPosition(app_id_after); | |
| 731 } | |
| 688 | 732 |
| 689 syncer::StringOrdinal pin_position; | 733 syncer::StringOrdinal pin_position; |
| 690 if (position_before.IsValid() && position_after.IsValid()) | 734 if (position_before.IsValid() && position_after.IsValid()) |
| 691 pin_position = position_before.CreateBetween(position_after); | 735 pin_position = position_before.CreateBetween(position_after); |
| 692 else if (position_before.IsValid()) | 736 else if (position_before.IsValid()) |
| 693 pin_position = position_before.CreateAfter(); | 737 pin_position = position_before.CreateAfter(); |
| 694 else if (position_after.IsValid()) | 738 else if (position_after.IsValid()) |
| 695 pin_position = position_after.CreateBefore(); | 739 pin_position = position_after.CreateBefore(); |
| 696 else | 740 else |
| 697 pin_position = syncer::StringOrdinal::CreateInitialOrdinal(); | 741 pin_position = syncer::StringOrdinal::CreateInitialOrdinal(); |
| 698 app_service->SetPinPosition(app_id, pin_position); | 742 app_service->SetPinPosition(app_id, pin_position); |
| 699 } | 743 } |
| 700 | 744 |
| 701 } // namespace launcher | 745 } // namespace launcher |
| 702 } // namespace ash | 746 } // namespace ash |
| OLD | NEW |