Chromium Code Reviews| Index: chrome/browser/ui/ash/chrome_launcher_prefs.cc |
| diff --git a/chrome/browser/ui/ash/chrome_launcher_prefs.cc b/chrome/browser/ui/ash/chrome_launcher_prefs.cc |
| index 440f652a259c20d0f7200b68f58d2dd081fdc082..bc153e8153682f0b0d109aea8a11fcc0742bc8d7 100644 |
| --- a/chrome/browser/ui/ash/chrome_launcher_prefs.cc |
| +++ b/chrome/browser/ui/ash/chrome_launcher_prefs.cc |
| @@ -237,15 +237,18 @@ class AppTracker { |
| } |
| void MaybeAddApp(const AppLauncherId& app_launcher_id, |
| - const LauncherControllerHelper* helper) { |
| + const LauncherControllerHelper* helper, |
| + bool check_for_valid_app) { |
| DCHECK_NE(kPinnedAppsPlaceholder, app_launcher_id.ToString()); |
| - if (!helper->IsValidIDForCurrentUser(app_launcher_id.ToString())) |
| + if (check_for_valid_app && |
| + !helper->IsValidIDForCurrentUser(app_launcher_id.ToString())) |
| return; |
|
stevenjb
2017/01/21 00:14:31
{}
khmel
2017/01/23 16:54:46
Done.
|
| AddApp(app_launcher_id); |
| } |
| void MaybeAddAppFromPref(const base::DictionaryValue* app_pref, |
| - const LauncherControllerHelper* helper) { |
| + const LauncherControllerHelper* helper, |
| + bool check_for_valid_app) { |
| std::string app_id; |
| if (!app_pref->GetString(kPinnedAppsPrefAppIDPath, &app_id)) { |
| LOG(ERROR) << "Cannot get app id from app pref entry."; |
| @@ -262,7 +265,7 @@ class AppTracker { |
| return; |
| } |
| - MaybeAddApp(AppLauncherId(app_id), helper); |
| + MaybeAddApp(AppLauncherId(app_id), helper, check_for_valid_app); |
| } |
| const std::vector<AppLauncherId>& app_list() const { return app_list_; } |
| @@ -399,6 +402,7 @@ void SetShelfAlignmentPref(PrefService* prefs, |
| // Helper that extracts app list from policy preferences. |
| void GetAppsPinnedByPolicy(const PrefService* prefs, |
| const LauncherControllerHelper* helper, |
| + bool check_for_valid_app, |
| AppTracker* apps) { |
| DCHECK(apps); |
| DCHECK(apps->app_list().empty()); |
| @@ -433,17 +437,19 @@ void GetAppsPinnedByPolicy(const PrefService* prefs, |
| for (const auto& activity : activities) { |
| const std::string arc_app_id = |
| ArcAppListPrefs::GetAppId(arc_package, activity); |
| - apps->MaybeAddApp(AppLauncherId(arc_app_id), helper); |
| + apps->MaybeAddApp(AppLauncherId(arc_app_id), helper, |
| + check_for_valid_app); |
| } |
| } else { |
| - apps->MaybeAddApp(AppLauncherId(app_id), helper); |
| + apps->MaybeAddApp(AppLauncherId(app_id), helper, check_for_valid_app); |
| } |
| } |
| } |
| std::vector<AppLauncherId> GetPinnedAppsFromPrefsLegacy( |
| const PrefService* prefs, |
| - const LauncherControllerHelper* helper) { |
| + const LauncherControllerHelper* helper, |
| + bool check_for_valid_app) { |
| // Adding the app list item to the list of items requires that the ID is not |
| // a valid and known ID for the extension system. The ID was constructed that |
| // way - but just to make sure... |
| @@ -461,7 +467,7 @@ std::vector<AppLauncherId> GetPinnedAppsFromPrefsLegacy( |
| CreateAppDict(AppLauncherId(extension_misc::kChromeAppId))); |
| AppTracker apps; |
| - GetAppsPinnedByPolicy(prefs, helper, &apps); |
| + GetAppsPinnedByPolicy(prefs, helper, check_for_valid_app, &apps); |
| std::string app_id; |
| for (size_t i = 0; i < pinned_apps->GetSize(); ++i) { |
| @@ -474,7 +480,7 @@ std::vector<AppLauncherId> GetPinnedAppsFromPrefsLegacy( |
| LOG(ERROR) << "There is no dictionary for app entry."; |
| continue; |
| } |
| - apps.MaybeAddAppFromPref(app_pref, helper); |
| + apps.MaybeAddAppFromPref(app_pref, helper, check_for_valid_app); |
| } |
| // If not added yet, the chrome item will be the last item in the list. |
| @@ -559,22 +565,24 @@ syncer::StringOrdinal GetLastPinPosition(Profile* profile) { |
| std::vector<AppLauncherId> ImportLegacyPinnedApps( |
| const PrefService* prefs, |
| - LauncherControllerHelper* helper, |
| - const AppTracker& policy_apps) { |
| - std::vector<AppLauncherId> legacy_pins = |
| - GetPinnedAppsFromPrefsLegacy(prefs, helper); |
| - DCHECK(!legacy_pins.empty()); |
| + LauncherControllerHelper* helper) { |
| + std::vector<AppLauncherId> legacy_pins_all = |
| + GetPinnedAppsFromPrefsLegacy(prefs, helper, false); |
| + DCHECK(!legacy_pins_all.empty()); |
| app_list::AppListSyncableService* app_service = |
| app_list::AppListSyncableServiceFactory::GetForProfile(helper->profile()); |
| + std::vector<AppLauncherId> legacy_pins_valid; |
| syncer::StringOrdinal last_position = |
| syncer::StringOrdinal::CreateInitialOrdinal(); |
| // Convert to sync item record. |
| - for (const auto& app_launcher_id : legacy_pins) { |
| + for (const auto& app_launcher_id : legacy_pins_all) { |
| DCHECK_NE(kPinnedAppsPlaceholder, app_launcher_id.ToString()); |
| app_service->SetPinPosition(app_launcher_id.ToString(), last_position); |
| last_position = last_position.CreateAfter(); |
| + if (helper->IsValidIDForCurrentUser(app_launcher_id.ToString())) |
| + legacy_pins_valid.push_back(app_launcher_id); |
| } |
| // Now process default apps. |
| @@ -590,7 +598,7 @@ std::vector<AppLauncherId> ImportLegacyPinnedApps( |
| last_position = last_position.CreateAfter(); |
| } |
| - return legacy_pins; |
| + return legacy_pins_valid; |
| } |
| std::vector<AppLauncherId> GetPinnedAppsFromPrefs( |
| @@ -604,9 +612,6 @@ std::vector<AppLauncherId> GetPinnedAppsFromPrefs( |
| std::vector<PinInfo> pin_infos; |
| - AppTracker policy_apps; |
| - GetAppsPinnedByPolicy(prefs, helper, &policy_apps); |
| - |
| // Empty pins indicates that sync based pin model is used for the first |
| // time. In normal workflow we have at least Chrome browser pin info. |
| bool first_run = true; |
| @@ -627,14 +632,23 @@ std::vector<AppLauncherId> GetPinnedAppsFromPrefs( |
| } |
| if (first_run) { |
| + // Return default apps in case profile is not synced yet. |
| + sync_preferences::PrefServiceSyncable* const pref_service_syncable = |
| + PrefServiceSyncableFromProfile(helper->profile()); |
| + if (!pref_service_syncable->IsSyncing()) |
| + return GetPinnedAppsFromPrefsLegacy(prefs, helper, true); |
| + |
| // We need to import legacy pins model and convert it to sync based |
| // model. |
| - return ImportLegacyPinnedApps(prefs, helper, policy_apps); |
| + return ImportLegacyPinnedApps(prefs, helper); |
| } |
| // Sort pins according their ordinals. |
| std::sort(pin_infos.begin(), pin_infos.end(), ComparePinInfo()); |
| + AppTracker policy_apps; |
| + GetAppsPinnedByPolicy(prefs, helper, true, &policy_apps); |
| + |
| // Pinned by policy apps appear first, if they were not shown before. |
| syncer::StringOrdinal front_position = GetFirstPinPosition(helper->profile()); |
| std::vector<AppLauncherId>::const_reverse_iterator it; |