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