| Index: chrome/browser/ui/app_list/app_list_service_impl.cc
|
| diff --git a/chrome/browser/ui/app_list/app_list_service_impl.cc b/chrome/browser/ui/app_list/app_list_service_impl.cc
|
| index a559132ee8711485e7dba4b86e68662bfbd5aeb9..006138fd5a42d4ae968088c0b95f813aae6b9102 100644
|
| --- a/chrome/browser/ui/app_list/app_list_service_impl.cc
|
| +++ b/chrome/browser/ui/app_list/app_list_service_impl.cc
|
| @@ -4,12 +4,20 @@
|
|
|
| #include "chrome/browser/ui/app_list/app_list_service_impl.h"
|
|
|
| +#include <string>
|
| +
|
| +#include "apps/pref_names.h"
|
| #include "base/command_line.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/prefs/pref_service.h"
|
| +#include "base/strings/string16.h"
|
| #include "base/time/time.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| +#include "chrome/browser/ui/app_list/keep_alive_service.h"
|
| +#include "chrome/browser/ui/app_list/keep_alive_service_impl.h"
|
| +#include "chrome/browser/ui/app_list/profile_loader.h"
|
| +#include "chrome/browser/ui/app_list/profile_store.h"
|
| #include "chrome/common/chrome_constants.h"
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/pref_names.h"
|
| @@ -65,15 +73,68 @@ void RecordDailyEventFrequency(
|
| }
|
| }
|
|
|
| -bool HasAppListEnabledPreference() {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - return local_state->GetBoolean(prefs::kAppLauncherHasBeenEnabled);
|
| -}
|
| +class ProfileStoreImpl : public ProfileStore {
|
| + public:
|
| + explicit ProfileStoreImpl(ProfileManager* profile_manager)
|
| + : profile_manager_(profile_manager),
|
| + weak_factory_(this) {
|
| + }
|
|
|
| -void SetAppListEnabledPreference(bool enabled) {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - local_state->SetBoolean(prefs::kAppLauncherHasBeenEnabled, enabled);
|
| -}
|
| + virtual void AddProfileObserver(ProfileInfoCacheObserver* observer) OVERRIDE {
|
| + profile_manager_->GetProfileInfoCache().AddObserver(observer);
|
| + }
|
| +
|
| + virtual void LoadProfileAsync(
|
| + const base::FilePath& path,
|
| + base::Callback<void(Profile*)> callback) OVERRIDE {
|
| + profile_manager_->CreateProfileAsync(
|
| + path,
|
| + base::Bind(&ProfileStoreImpl::OnProfileCreated,
|
| + weak_factory_.GetWeakPtr(),
|
| + callback),
|
| + base::string16(),
|
| + base::string16(),
|
| + std::string());
|
| + }
|
| +
|
| + void OnProfileCreated(base::Callback<void(Profile*)> callback,
|
| + Profile* profile,
|
| + Profile::CreateStatus status) {
|
| + switch (status) {
|
| + case Profile::CREATE_STATUS_CREATED:
|
| + break;
|
| + case Profile::CREATE_STATUS_INITIALIZED:
|
| + callback.Run(profile);
|
| + break;
|
| + case Profile::CREATE_STATUS_LOCAL_FAIL:
|
| + case Profile::CREATE_STATUS_REMOTE_FAIL:
|
| + case Profile::CREATE_STATUS_CANCELED:
|
| + break;
|
| + case Profile::MAX_CREATE_STATUS:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| + }
|
| +
|
| + virtual Profile* GetProfileByPath(const base::FilePath& path) OVERRIDE {
|
| + return profile_manager_->GetProfileByPath(path);
|
| + }
|
| +
|
| + virtual base::FilePath GetUserDataDir() OVERRIDE {
|
| + return profile_manager_->user_data_dir();
|
| + }
|
| +
|
| + virtual bool IsProfileManaged(const base::FilePath& profile_path) OVERRIDE {
|
| + ProfileInfoCache& profile_info =
|
| + g_browser_process->profile_manager()->GetProfileInfoCache();
|
| + size_t profile_index = profile_info.GetIndexOfProfileWithPath(profile_path);
|
| + return profile_info.ProfileIsManagedAtIndex(profile_index);
|
| + }
|
| +
|
| + private:
|
| + ProfileManager* profile_manager_;
|
| + base::WeakPtrFactory<ProfileStoreImpl> weak_factory_;
|
| +};
|
|
|
| } // namespace
|
|
|
| @@ -106,12 +167,30 @@ void AppListServiceImpl::SendAppListStats() {
|
|
|
| AppListServiceImpl::AppListServiceImpl()
|
| : profile_(NULL),
|
| - profile_load_sequence_id_(0),
|
| - pending_profile_loads_(0),
|
| + profile_store_(new ProfileStoreImpl(
|
| + g_browser_process->profile_manager())),
|
| weak_factory_(this),
|
| - profile_loader_(g_browser_process->profile_manager()) {
|
| - ProfileManager* profile_manager = g_browser_process->profile_manager();
|
| - profile_manager->GetProfileInfoCache().AddObserver(this);
|
| + command_line_(*CommandLine::ForCurrentProcess()),
|
| + local_state_(g_browser_process->local_state()),
|
| + profile_loader_(new ProfileLoader(
|
| + profile_store_.get(),
|
| + scoped_ptr<KeepAliveService>(new KeepAliveServiceImpl))) {
|
| + profile_store_->AddProfileObserver(this);
|
| +}
|
| +
|
| +AppListServiceImpl::AppListServiceImpl(
|
| + const CommandLine& command_line,
|
| + PrefService* local_state,
|
| + scoped_ptr<ProfileStore> profile_store,
|
| + scoped_ptr<KeepAliveService> keep_alive_service)
|
| + : profile_(NULL),
|
| + profile_store_(profile_store.Pass()),
|
| + weak_factory_(this),
|
| + command_line_(command_line),
|
| + local_state_(local_state),
|
| + profile_loader_(new ProfileLoader(
|
| + profile_store_.get(), keep_alive_service.Pass())) {
|
| + profile_store_->AddProfileObserver(this);
|
| }
|
|
|
| AppListServiceImpl::~AppListServiceImpl() {}
|
| @@ -125,18 +204,15 @@ void AppListServiceImpl::Init(Profile* initial_profile) {}
|
|
|
| base::FilePath AppListServiceImpl::GetProfilePath(
|
| const base::FilePath& user_data_dir) {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - DCHECK(local_state);
|
| -
|
| std::string app_list_profile;
|
| - if (local_state->HasPrefPath(prefs::kAppListProfile))
|
| - app_list_profile = local_state->GetString(prefs::kAppListProfile);
|
| + if (local_state_->HasPrefPath(prefs::kAppListProfile))
|
| + app_list_profile = local_state_->GetString(prefs::kAppListProfile);
|
|
|
| // If the user has no profile preference for the app launcher, default to the
|
| // last browser profile used.
|
| if (app_list_profile.empty() &&
|
| - local_state->HasPrefPath(prefs::kProfileLastUsed)) {
|
| - app_list_profile = local_state->GetString(prefs::kProfileLastUsed);
|
| + local_state_->HasPrefPath(prefs::kProfileLastUsed)) {
|
| + app_list_profile = local_state_->GetString(prefs::kProfileLastUsed);
|
| }
|
|
|
| // If there is no last used profile recorded, use the initial profile.
|
| @@ -148,13 +224,12 @@ base::FilePath AppListServiceImpl::GetProfilePath(
|
|
|
| void AppListServiceImpl::SetProfilePath(const base::FilePath& profile_path) {
|
| // Ensure we don't set the pref to a managed user's profile path.
|
| - ProfileInfoCache& profile_info =
|
| - g_browser_process->profile_manager()->GetProfileInfoCache();
|
| - size_t profile_index = profile_info.GetIndexOfProfileWithPath(profile_path);
|
| - if (profile_info.ProfileIsManagedAtIndex(profile_index))
|
| + // TODO(calamity): Filter out managed profiles from the settings app so this
|
| + // can't get hit, so we can remove it.
|
| + if (profile_store_->IsProfileManaged(profile_path))
|
| return;
|
|
|
| - g_browser_process->local_state()->SetString(
|
| + local_state_->SetString(
|
| prefs::kAppListProfile,
|
| profile_path.BaseName().MaybeAsASCII());
|
| }
|
| @@ -166,28 +241,27 @@ void AppListServiceImpl::OnProfileWillBeRemoved(
|
| const base::FilePath& profile_path) {
|
| // If the profile the app list uses just got deleted, reset it to the last
|
| // used profile.
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - std::string app_list_last_profile = local_state->GetString(
|
| + std::string app_list_last_profile = local_state_->GetString(
|
| prefs::kAppListProfile);
|
| if (profile_path.BaseName().MaybeAsASCII() == app_list_last_profile) {
|
| - local_state->SetString(prefs::kAppListProfile,
|
| - local_state->GetString(prefs::kProfileLastUsed));
|
| + local_state_->SetString(prefs::kAppListProfile,
|
| + local_state_->GetString(prefs::kProfileLastUsed));
|
| }
|
| }
|
|
|
| void AppListServiceImpl::Show() {
|
| - profile_loader_.LoadProfileInvalidatingOtherLoads(
|
| - GetProfilePath(g_browser_process->profile_manager()->user_data_dir()),
|
| + profile_loader_->LoadProfileInvalidatingOtherLoads(
|
| + GetProfilePath(profile_store_->GetUserDataDir()),
|
| base::Bind(&AppListServiceImpl::ShowForProfile,
|
| weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| void AppListServiceImpl::EnableAppList(Profile* initial_profile) {
|
| SetProfilePath(initial_profile->GetPath());
|
| - if (HasAppListEnabledPreference())
|
| + if (local_state_->GetBoolean(prefs::kAppLauncherHasBeenEnabled))
|
| return;
|
|
|
| - SetAppListEnabledPreference(true);
|
| + local_state_->SetBoolean(prefs::kAppLauncherHasBeenEnabled, true);
|
| CreateShortcut();
|
| }
|
|
|
| @@ -200,16 +274,18 @@ void AppListServiceImpl::SetProfile(Profile* new_profile) {
|
| }
|
|
|
| void AppListServiceImpl::InvalidatePendingProfileLoads() {
|
| - profile_loader_.InvalidatePendingProfileLoads();
|
| + profile_loader_->InvalidatePendingProfileLoads();
|
| }
|
|
|
| void AppListServiceImpl::HandleCommandLineFlags(Profile* initial_profile) {
|
| - if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAppList))
|
| + if (command_line_.HasSwitch(switches::kEnableAppList))
|
| EnableAppList(initial_profile);
|
|
|
| - if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableAppList))
|
| - SetAppListEnabledPreference(false);
|
| + if (command_line_.HasSwitch(switches::kDisableAppList))
|
| + local_state_->SetBoolean(prefs::kAppLauncherHasBeenEnabled, false);
|
| +}
|
|
|
| +void AppListServiceImpl::SendUsageStats() {
|
| // Send app list usage stats after a delay.
|
| const int kSendUsageStatsDelay = 5;
|
| base::MessageLoop::current()->PostDelayedTask(
|
|
|