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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/app_list/app_list_view_delegate.h" 6 7 #include "base/callback.h" 8 #include "base/files/file_path.h" 9 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/extensions/extension_service.h" 11 #include "chrome/browser/feedback/feedback_util.h" 12 #include "chrome/browser/profiles/profile_manager.h" 13 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" 14 #include "chrome/browser/ui/app_list/apps_model_builder.h" 15 #include "chrome/browser/ui/app_list/chrome_app_list_item.h" 16 #include "chrome/browser/ui/app_list/chrome_signin_delegate.h" 17 #include "chrome/browser/ui/app_list/search/search_controller.h" 18 #include "chrome/browser/ui/browser_finder.h" 19 #include "chrome/browser/ui/chrome_pages.h" 20 #include "chrome/browser/ui/host_desktop.h" 21 #include "chrome/browser/ui/web_applications/web_app_ui.h" 22 #include "chrome/browser/web_applications/web_app.h" 23 #include "chrome/common/extensions/extension_constants.h" 24 #include "chrome/common/url_constants.h" 25 #include "content/public/browser/browser_thread.h" 26 #include "content/public/browser/page_navigator.h" 27 #include "content/public/browser/user_metrics.h" 28 29 #if defined(USE_ASH) 30 #include "chrome/browser/ui/ash/app_list/app_sync_ui_state_watcher.h" 31 #endif 32 33 #if defined(OS_WIN) 34 #include "chrome/browser/web_applications/web_app_win.h" 35 #endif 36 37 namespace { 38 39 #if defined(OS_WIN) 40 void CreateShortcutInWebAppDir( 41 const base::FilePath& app_data_dir, 42 base::Callback<void(const base::FilePath&)> callback, 43 const ShellIntegration::ShortcutInfo& info) { 44 content::BrowserThread::PostTaskAndReplyWithResult( 45 content::BrowserThread::FILE, 46 FROM_HERE, 47 base::Bind(web_app::CreateShortcutInWebAppDir, app_data_dir, info), 48 callback); 49 } 50 #endif 51 52 } // namespace 53 54 AppListViewDelegate::AppListViewDelegate(AppListControllerDelegate* controller, 55 Profile* profile) 56 : controller_(controller), 57 profile_(profile) {} 58 59 AppListViewDelegate::~AppListViewDelegate() {} 60 61 void AppListViewDelegate::SetModel(app_list::AppListModel* model) { 62 if (model) { 63 apps_builder_.reset(new AppsModelBuilder(profile_, 64 model->apps(), 65 controller_.get())); 66 apps_builder_->Build(); 67 68 search_controller_.reset(new app_list::SearchController( 69 profile_, model->search_box(), model->results(), controller_.get())); 70 71 signin_delegate_.reset(new ChromeSigninDelegate(profile_)); 72 73 #if defined(USE_ASH) 74 app_sync_ui_state_watcher_.reset(new AppSyncUIStateWatcher(profile_, 75 model)); 76 #endif 77 } else { 78 apps_builder_.reset(); 79 search_controller_.reset(); 80 #if defined(USE_ASH) 81 app_sync_ui_state_watcher_.reset(); 82 #endif 83 } 84 } 85 86 app_list::SigninDelegate* AppListViewDelegate::GetSigninDelegate() { 87 return signin_delegate_.get(); 88 } 89 90 void AppListViewDelegate::ActivateAppListItem( 91 app_list::AppListItemModel* item, 92 int event_flags) { 93 content::RecordAction(content::UserMetricsAction("AppList_ClickOnApp")); 94 static_cast<ChromeAppListItem*>(item)->Activate(event_flags); 95 } 96 97 void AppListViewDelegate::GetShortcutPathForApp( 98 const std::string& app_id, 99 const base::Callback<void(const base::FilePath&)>& callback) { 100 #if defined(OS_WIN) 101 ExtensionService* service = profile_->GetExtensionService(); 102 DCHECK(service); 103 const extensions::Extension* extension = 104 service->GetInstalledExtension(app_id); 105 if (!extension) { 106 callback.Run(base::FilePath()); 107 return; 108 } 109 110 base::FilePath app_data_dir( 111 web_app::GetWebAppDataDirectory(profile_->GetPath(), 112 extension->id(), 113 GURL())); 114 115 web_app::UpdateShortcutInfoAndIconForApp( 116 *extension, 117 profile_, 118 base::Bind(CreateShortcutInWebAppDir, app_data_dir, callback)); 119 #else 120 callback.Run(base::FilePath()); 121 #endif 122 } 123 124 void AppListViewDelegate::StartSearch() { 125 if (search_controller_.get()) 126 search_controller_->Start(); 127 } 128 129 void AppListViewDelegate::StopSearch() { 130 if (search_controller_.get()) 131 search_controller_->Stop(); 132 } 133 134 void AppListViewDelegate::OpenSearchResult( 135 app_list::SearchResult* result, 136 int event_flags) { 137 search_controller_->OpenResult(result, event_flags); 138 } 139 140 void AppListViewDelegate::InvokeSearchResultAction( 141 app_list::SearchResult* result, 142 int action_index, 143 int event_flags) { 144 search_controller_->InvokeResultAction(result, action_index, event_flags); 145 } 146 147 void AppListViewDelegate::Dismiss() { 148 controller_->DismissView(); 149 } 150 151 void AppListViewDelegate::ViewClosing() { 152 controller_->ViewClosing(); 153 } 154 155 void AppListViewDelegate::ViewActivationChanged(bool active) { 156 controller_->ViewActivationChanged(active); 157 } 158 159 gfx::ImageSkia AppListViewDelegate::GetWindowIcon() { 160 return controller_->GetWindowIcon(); 161 } 162 163 string16 AppListViewDelegate::GetCurrentUserName() { 164 ProfileInfoCache& cache = 165 g_browser_process->profile_manager()->GetProfileInfoCache(); 166 size_t profile_index = cache.GetIndexOfProfileWithPath(profile_->GetPath()); 167 if (profile_index != std::string::npos) 168 return cache.GetNameOfProfileAtIndex(profile_index); 169 170 return string16(); 171 } 172 173 string16 AppListViewDelegate::GetCurrentUserEmail() { 174 ProfileInfoCache& cache = 175 g_browser_process->profile_manager()->GetProfileInfoCache(); 176 size_t profile_index = cache.GetIndexOfProfileWithPath(profile_->GetPath()); 177 if (profile_index != std::string::npos) 178 return cache.GetUserNameOfProfileAtIndex(profile_index); 179 180 return string16(); 181 } 182 183 void AppListViewDelegate::OpenSettings() { 184 ExtensionService* service = profile_->GetExtensionService(); 185 DCHECK(service); 186 const extensions::Extension* extension = service->GetInstalledExtension( 187 extension_misc::kSettingsAppId); 188 DCHECK(extension); 189 controller_->ActivateApp(profile_, extension, 0); 190 } 191 192 void AppListViewDelegate::OpenHelp() { 193 chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow( 194 controller_->GetAppListWindow()); 195 Browser* browser = chrome::FindOrCreateTabbedBrowser( 196 profile_, desktop); 197 browser->OpenURL(content::OpenURLParams(GURL(chrome::kAppLauncherHelpURL), 198 content::Referrer(), 199 NEW_FOREGROUND_TAB, 200 content::PAGE_TRANSITION_LINK, 201 false)); 202 } 203 204 void AppListViewDelegate::OpenFeedback() { 205 chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow( 206 controller_->GetAppListWindow()); 207 Browser* browser = chrome::FindOrCreateTabbedBrowser( 208 profile_, desktop); 209 chrome::ShowFeedbackPage(browser, std::string(), 210 chrome::kAppLauncherCategoryTag); 211 } 212