app_list_service_impl.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Copyright 2013 The Chromium Authors. All rights reserved.
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Use of this source code is governed by a BSD-style license that can be
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// found in the LICENSE file.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/ui/app_list/app_list_service_impl.h"
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string>
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "apps/pref_names.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/command_line.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/metrics/histogram.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/prefs/pref_service.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/strings/string16.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/time/time.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/apps/shortcut_manager.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/apps/shortcut_manager_factory.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/browser_process.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/profiles/profile_manager.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/ui/app_list/keep_alive_service.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/ui/app_list/keep_alive_service_impl.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/ui/app_list/profile_loader.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/ui/app_list/profile_store.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/common/chrome_constants.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/common/chrome_switches.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/common/pref_names.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "content/public/browser/browser_thread.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace {
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid SendAppListAppLaunch(int count) {
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UMA_HISTOGRAM_CUSTOM_COUNTS(
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "Apps.AppListDailyAppLaunches", count, 1, 1000, 50);
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (count > 0)
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UMA_HISTOGRAM_ENUMERATION("Apps.AppListHasLaunchedAppToday", 1, 2);
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid SendAppListLaunch(int count) {
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UMA_HISTOGRAM_CUSTOM_COUNTS(
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "Apps.AppListDailyLaunches", count, 1, 1000, 50);
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (count > 0)
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UMA_HISTOGRAM_ENUMERATION("Apps.AppListHasLaunchedAppListToday", 1, 2);
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgbool SendDailyEventFrequency(
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* last_ping_pref,
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* count_pref,
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void (*send_callback)(int count)) {
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  PrefService* local_state = g_browser_process->local_state();
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::Time now = base::Time::Now();
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::Time last = base::Time::FromInternalValue(local_state->GetInt64(
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      last_ping_pref));
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int days = (now - last).InDays();
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (days > 0) {
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    send_callback(local_state->GetInteger(count_pref));
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    local_state->SetInt64(
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        last_ping_pref,
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (last + base::TimeDelta::FromDays(days)).ToInternalValue());
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    local_state->SetInteger(count_pref, 0);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return true;
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return false;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RecordDailyEventFrequency(
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* last_ping_pref,
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* count_pref,
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void (*send_callback)(int count)) {
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  PrefService* local_state = g_browser_process->local_state();
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int count = local_state->GetInteger(count_pref);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  local_state->SetInteger(count_pref, count + 1);
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (SendDailyEventFrequency(last_ping_pref, count_pref, send_callback)) {
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    local_state->SetInteger(count_pref, 1);
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ProfileStoreImpl : public ProfileStore {
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  explicit ProfileStoreImpl(ProfileManager* profile_manager)
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      : profile_manager_(profile_manager),
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        weak_factory_(this) {
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void AddProfileObserver(ProfileInfoCacheObserver* observer) OVERRIDE {
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    profile_manager_->GetProfileInfoCache().AddObserver(observer);
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void LoadProfileAsync(
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const base::FilePath& path,
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Callback<void(Profile*)> callback) OVERRIDE {
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    profile_manager_->CreateProfileAsync(
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        path,
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        base::Bind(&ProfileStoreImpl::OnProfileCreated,
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   weak_factory_.GetWeakPtr(),
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   callback),
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        base::string16(),
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        base::string16(),
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        std::string());
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void OnProfileCreated(base::Callback<void(Profile*)> callback,
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        Profile* profile,
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        Profile::CreateStatus status) {
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (status) {
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      case Profile::CREATE_STATUS_CREATED:
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      case Profile::CREATE_STATUS_INITIALIZED:
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        callback.Run(profile);
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      case Profile::CREATE_STATUS_LOCAL_FAIL:
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      case Profile::CREATE_STATUS_REMOTE_FAIL:
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      case Profile::CREATE_STATUS_CANCELED:
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      case Profile::MAX_CREATE_STATUS:
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        NOTREACHED();
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual Profile* GetProfileByPath(const base::FilePath& path) OVERRIDE {
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return profile_manager_->GetProfileByPath(path);
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual base::FilePath GetUserDataDir() OVERRIDE {
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return profile_manager_->user_data_dir();
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual bool IsProfileManaged(const base::FilePath& profile_path) OVERRIDE {
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ProfileInfoCache& profile_info =
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        g_browser_process->profile_manager()->GetProfileInfoCache();
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    size_t profile_index = profile_info.GetIndexOfProfileWithPath(profile_path);
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return profile_info.ProfileIsManagedAtIndex(profile_index);
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ProfileManager* profile_manager_;
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::WeakPtrFactory<ProfileStoreImpl> weak_factory_;
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}  // namespace
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// static
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::RecordAppListLaunch() {
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  RecordDailyEventFrequency(prefs::kLastAppListLaunchPing,
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            prefs::kAppListLaunchCount,
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            &SendAppListLaunch);
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// static
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::RecordAppListAppLaunch() {
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  RecordDailyEventFrequency(prefs::kLastAppListAppLaunchPing,
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            prefs::kAppListAppLaunchCount,
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            &SendAppListAppLaunch);
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// static
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::SendAppListStats() {
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (!g_browser_process || g_browser_process->IsShuttingDown())
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  SendDailyEventFrequency(prefs::kLastAppListLaunchPing,
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          prefs::kAppListLaunchCount,
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          &SendAppListLaunch);
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  SendDailyEventFrequency(prefs::kLastAppListAppLaunchPing,
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          prefs::kAppListAppLaunchCount,
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          &SendAppListAppLaunch);
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgAppListServiceImpl::AppListServiceImpl()
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    : profile_store_(new ProfileStoreImpl(
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          g_browser_process->profile_manager())),
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      weak_factory_(this),
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      command_line_(*CommandLine::ForCurrentProcess()),
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      local_state_(g_browser_process->local_state()),
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      profile_loader_(new ProfileLoader(
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          profile_store_.get(),
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          scoped_ptr<KeepAliveService>(new KeepAliveServiceImpl))) {
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  profile_store_->AddProfileObserver(this);
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgAppListServiceImpl::AppListServiceImpl(
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const CommandLine& command_line,
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PrefService* local_state,
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    scoped_ptr<ProfileStore> profile_store,
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    scoped_ptr<KeepAliveService> keep_alive_service)
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    : profile_store_(profile_store.Pass()),
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      weak_factory_(this),
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      command_line_(command_line),
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      local_state_(local_state),
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      profile_loader_(new ProfileLoader(
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          profile_store_.get(), keep_alive_service.Pass())) {
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  profile_store_->AddProfileObserver(this);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgAppListServiceImpl::~AppListServiceImpl() {}
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::SetAppListNextPaintCallback(
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const base::Closure& callback) {}
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::HandleFirstRun() {}
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::Init(Profile* initial_profile) {}
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgbase::FilePath AppListServiceImpl::GetProfilePath(
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const base::FilePath& user_data_dir) {
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  std::string app_list_profile;
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (local_state_->HasPrefPath(prefs::kAppListProfile))
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app_list_profile = local_state_->GetString(prefs::kAppListProfile);
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // If the user has no profile preference for the app launcher, default to the
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // last browser profile used.
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (app_list_profile.empty() &&
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      local_state_->HasPrefPath(prefs::kProfileLastUsed)) {
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app_list_profile = local_state_->GetString(prefs::kProfileLastUsed);
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // If there is no last used profile recorded, use the initial profile.
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (app_list_profile.empty())
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app_list_profile = chrome::kInitialProfile;
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return user_data_dir.AppendASCII(app_list_profile);
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::SetProfilePath(const base::FilePath& profile_path) {
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Ensure we don't set the pref to a managed user's profile path.
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // TODO(calamity): Filter out managed profiles from the settings app so this
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // can't get hit, so we can remove it.
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (profile_store_->IsProfileManaged(profile_path))
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  local_state_->SetString(
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      prefs::kAppListProfile,
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      profile_path.BaseName().MaybeAsASCII());
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::CreateShortcut() {}
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// We need to watch for profile removal to keep kAppListProfile updated.
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::OnProfileWillBeRemoved(
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const base::FilePath& profile_path) {
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // If the profile the app list uses just got deleted, reset it to the last
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // used profile.
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  std::string app_list_last_profile = local_state_->GetString(
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      prefs::kAppListProfile);
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (profile_path.BaseName().MaybeAsASCII() == app_list_last_profile) {
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    local_state_->SetString(prefs::kAppListProfile,
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        local_state_->GetString(prefs::kProfileLastUsed));
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::Show() {
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  profile_loader_->LoadProfileInvalidatingOtherLoads(
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      GetProfilePath(profile_store_->GetUserDataDir()),
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&AppListServiceImpl::ShowForProfile,
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 weak_factory_.GetWeakPtr()));
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::EnableAppList(Profile* initial_profile) {
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  SetProfilePath(initial_profile->GetPath());
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (local_state_->GetBoolean(prefs::kAppLauncherHasBeenEnabled))
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  local_state_->SetBoolean(prefs::kAppLauncherHasBeenEnabled, true);
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  CreateShortcut();
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  AppShortcutManagerFactory::GetForProfile(initial_profile)->
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      OnceOffCreateShortcuts();
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::InvalidatePendingProfileLoads() {
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  profile_loader_->InvalidatePendingProfileLoads();
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::HandleCommandLineFlags(Profile* initial_profile) {
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (command_line_.HasSwitch(switches::kEnableAppList))
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    EnableAppList(initial_profile);
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (command_line_.HasSwitch(switches::kResetAppListInstallState))
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    local_state_->SetBoolean(prefs::kAppLauncherHasBeenEnabled, false);
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AppListServiceImpl::SendUsageStats() {
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Send app list usage stats after a delay.
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const int kSendUsageStatsDelay = 5;
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::MessageLoop::current()->PostDelayedTask(
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      FROM_HERE,
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&AppListServiceImpl::SendAppListStats),
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::TimeDelta::FromSeconds(kSendUsageStatsDelay));
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org