| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/app_list/search/app_search_provider.h" | 5 #include "chrome/browser/ui/app_list/search/app_search_provider.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 | 73 |
| 74 class AppSearchProvider::DataSource { | 74 class AppSearchProvider::DataSource { |
| 75 public: | 75 public: |
| 76 DataSource(Profile* profile, AppSearchProvider* owner) | 76 DataSource(Profile* profile, AppSearchProvider* owner) |
| 77 : profile_(profile), | 77 : profile_(profile), |
| 78 owner_(owner) {} | 78 owner_(owner) {} |
| 79 virtual ~DataSource() {} | 79 virtual ~DataSource() {} |
| 80 | 80 |
| 81 virtual void AddApps(Apps* apps) = 0; | 81 virtual void AddApps(Apps* apps) = 0; |
| 82 | 82 |
| 83 virtual scoped_ptr<AppResult> CreateResult( | 83 virtual std::unique_ptr<AppResult> CreateResult( |
| 84 const std::string& app_id, | 84 const std::string& app_id, |
| 85 AppListControllerDelegate* list_controller, | 85 AppListControllerDelegate* list_controller, |
| 86 AppListItemList* top_level_item_list, | 86 AppListItemList* top_level_item_list, |
| 87 bool is_recommended) = 0; | 87 bool is_recommended) = 0; |
| 88 | 88 |
| 89 protected: | 89 protected: |
| 90 Profile* profile() { return profile_; } | 90 Profile* profile() { return profile_; } |
| 91 AppSearchProvider* owner() { return owner_; } | 91 AppSearchProvider* owner() { return owner_; } |
| 92 | 92 |
| 93 private: | 93 private: |
| (...skipping 17 matching lines...) Expand all Loading... |
| 111 ~ExtensionDataSource() override {} | 111 ~ExtensionDataSource() override {} |
| 112 | 112 |
| 113 // AppSearchProvider::DataSource overrides: | 113 // AppSearchProvider::DataSource overrides: |
| 114 void AddApps(AppSearchProvider::Apps* apps) override { | 114 void AddApps(AppSearchProvider::Apps* apps) override { |
| 115 ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); | 115 ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); |
| 116 AddApps(apps, registry->enabled_extensions()); | 116 AddApps(apps, registry->enabled_extensions()); |
| 117 AddApps(apps, registry->disabled_extensions()); | 117 AddApps(apps, registry->disabled_extensions()); |
| 118 AddApps(apps, registry->terminated_extensions()); | 118 AddApps(apps, registry->terminated_extensions()); |
| 119 } | 119 } |
| 120 | 120 |
| 121 scoped_ptr<AppResult> CreateResult( | 121 std::unique_ptr<AppResult> CreateResult( |
| 122 const std::string& app_id, | 122 const std::string& app_id, |
| 123 AppListControllerDelegate* list_controller, | 123 AppListControllerDelegate* list_controller, |
| 124 AppListItemList* top_level_item_list, | 124 AppListItemList* top_level_item_list, |
| 125 bool is_recommended) override { | 125 bool is_recommended) override { |
| 126 return scoped_ptr<AppResult>(new ExtensionAppResult(profile(), | 126 return std::unique_ptr<AppResult>(new ExtensionAppResult( |
| 127 app_id, | 127 profile(), app_id, list_controller, is_recommended)); |
| 128 list_controller, | |
| 129 is_recommended)); | |
| 130 } | 128 } |
| 131 | 129 |
| 132 // extensions::ExtensionRegistryObserver overrides: | 130 // extensions::ExtensionRegistryObserver overrides: |
| 133 void OnExtensionLoaded(content::BrowserContext* browser_context, | 131 void OnExtensionLoaded(content::BrowserContext* browser_context, |
| 134 const extensions::Extension* extension) override { | 132 const extensions::Extension* extension) override { |
| 135 owner()->RefreshAppsAndUpdateResults(false); | 133 owner()->RefreshAppsAndUpdateResults(false); |
| 136 } | 134 } |
| 137 | 135 |
| 138 void OnExtensionUninstalled(content::BrowserContext* browser_context, | 136 void OnExtensionUninstalled(content::BrowserContext* browser_context, |
| 139 const extensions::Extension* extension, | 137 const extensions::Extension* extension, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 152 if (!extensions::ui_util::ShouldDisplayInAppLauncher(extension, | 150 if (!extensions::ui_util::ShouldDisplayInAppLauncher(extension, |
| 153 profile())) { | 151 profile())) { |
| 154 continue; | 152 continue; |
| 155 } | 153 } |
| 156 | 154 |
| 157 if (profile()->IsOffTheRecord() && | 155 if (profile()->IsOffTheRecord() && |
| 158 !extensions::util::CanLoadInIncognito(extension, profile())) { | 156 !extensions::util::CanLoadInIncognito(extension, profile())) { |
| 159 continue; | 157 continue; |
| 160 } | 158 } |
| 161 | 159 |
| 162 scoped_ptr<AppSearchProvider::App> app( | 160 std::unique_ptr<AppSearchProvider::App> app(new AppSearchProvider::App( |
| 163 new AppSearchProvider::App( | 161 this, extension->id(), extension->short_name(), |
| 164 this, | 162 prefs->GetLastLaunchTime(extension->id()))); |
| 165 extension->id(), | |
| 166 extension->short_name(), | |
| 167 prefs->GetLastLaunchTime(extension->id()))); | |
| 168 apps->push_back(std::move(app)); | 163 apps->push_back(std::move(app)); |
| 169 } | 164 } |
| 170 } | 165 } |
| 171 | 166 |
| 172 ScopedObserver<extensions::ExtensionRegistry, | 167 ScopedObserver<extensions::ExtensionRegistry, |
| 173 extensions::ExtensionRegistryObserver> | 168 extensions::ExtensionRegistryObserver> |
| 174 extension_registry_observer_; | 169 extension_registry_observer_; |
| 175 | 170 |
| 176 DISALLOW_COPY_AND_ASSIGN(ExtensionDataSource); | 171 DISALLOW_COPY_AND_ASSIGN(ExtensionDataSource); |
| 177 }; | 172 }; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 189 ArcAppListPrefs::Get(profile())->RemoveObserver(this); | 184 ArcAppListPrefs::Get(profile())->RemoveObserver(this); |
| 190 } | 185 } |
| 191 | 186 |
| 192 // AppSearchProvider::DataSource overrides: | 187 // AppSearchProvider::DataSource overrides: |
| 193 void AddApps(AppSearchProvider::Apps* apps) override { | 188 void AddApps(AppSearchProvider::Apps* apps) override { |
| 194 ArcAppListPrefs* arc_prefs = ArcAppListPrefs::Get(profile()); | 189 ArcAppListPrefs* arc_prefs = ArcAppListPrefs::Get(profile()); |
| 195 CHECK(arc_prefs); | 190 CHECK(arc_prefs); |
| 196 | 191 |
| 197 const std::vector<std::string> app_ids = arc_prefs->GetAppIds(); | 192 const std::vector<std::string> app_ids = arc_prefs->GetAppIds(); |
| 198 for (const auto& app_id : app_ids) { | 193 for (const auto& app_id : app_ids) { |
| 199 scoped_ptr<ArcAppListPrefs::AppInfo> app_info = arc_prefs->GetApp(app_id); | 194 std::unique_ptr<ArcAppListPrefs::AppInfo> app_info = |
| 195 arc_prefs->GetApp(app_id); |
| 200 if (!app_info) { | 196 if (!app_info) { |
| 201 NOTREACHED(); | 197 NOTREACHED(); |
| 202 continue; | 198 continue; |
| 203 } | 199 } |
| 204 | 200 |
| 205 scoped_ptr<AppSearchProvider::App> app( | 201 std::unique_ptr<AppSearchProvider::App> app(new AppSearchProvider::App( |
| 206 new AppSearchProvider::App(this, | 202 this, app_id, app_info->name, app_info->last_launch_time)); |
| 207 app_id, | |
| 208 app_info->name, | |
| 209 app_info->last_launch_time)); | |
| 210 apps->push_back(std::move(app)); | 203 apps->push_back(std::move(app)); |
| 211 } | 204 } |
| 212 } | 205 } |
| 213 | 206 |
| 214 scoped_ptr<AppResult> CreateResult( | 207 std::unique_ptr<AppResult> CreateResult( |
| 215 const std::string& app_id, | 208 const std::string& app_id, |
| 216 AppListControllerDelegate* list_controller, | 209 AppListControllerDelegate* list_controller, |
| 217 AppListItemList* top_level_item_list, | 210 AppListItemList* top_level_item_list, |
| 218 bool is_recommended) override { | 211 bool is_recommended) override { |
| 219 return scoped_ptr<AppResult>(new ArcAppResult(profile(), | 212 return std::unique_ptr<AppResult>( |
| 220 app_id, | 213 new ArcAppResult(profile(), app_id, list_controller, is_recommended)); |
| 221 list_controller, | |
| 222 is_recommended)); | |
| 223 } | 214 } |
| 224 | 215 |
| 225 // ArcAppListPrefs::Observer overrides: | 216 // ArcAppListPrefs::Observer overrides: |
| 226 void OnAppRegistered(const std::string& app_id, | 217 void OnAppRegistered(const std::string& app_id, |
| 227 const ArcAppListPrefs::AppInfo& app_info) override { | 218 const ArcAppListPrefs::AppInfo& app_info) override { |
| 228 owner()->RefreshAppsAndUpdateResults(false); | 219 owner()->RefreshAppsAndUpdateResults(false); |
| 229 } | 220 } |
| 230 | 221 |
| 231 void OnAppRemoved(const std::string& id) override { | 222 void OnAppRemoved(const std::string& id) override { |
| 232 owner()->RefreshAppsAndUpdateResults(true); | 223 owner()->RefreshAppsAndUpdateResults(true); |
| 233 } | 224 } |
| 234 | 225 |
| 235 void OnAppNameUpdated(const std::string& id, | 226 void OnAppNameUpdated(const std::string& id, |
| 236 const std::string& name) override { | 227 const std::string& name) override { |
| 237 owner()->RefreshAppsAndUpdateResults(false); | 228 owner()->RefreshAppsAndUpdateResults(false); |
| 238 } | 229 } |
| 239 | 230 |
| 240 private: | 231 private: |
| 241 DISALLOW_COPY_AND_ASSIGN(ArcDataSource); | 232 DISALLOW_COPY_AND_ASSIGN(ArcDataSource); |
| 242 }; | 233 }; |
| 243 #endif | 234 #endif |
| 244 | 235 |
| 245 } // namespace | 236 } // namespace |
| 246 | 237 |
| 247 AppSearchProvider::AppSearchProvider(Profile* profile, | 238 AppSearchProvider::AppSearchProvider(Profile* profile, |
| 248 AppListControllerDelegate* list_controller, | 239 AppListControllerDelegate* list_controller, |
| 249 scoped_ptr<base::Clock> clock, | 240 std::unique_ptr<base::Clock> clock, |
| 250 AppListItemList* top_level_item_list) | 241 AppListItemList* top_level_item_list) |
| 251 : profile_(profile), | 242 : profile_(profile), |
| 252 list_controller_(list_controller), | 243 list_controller_(list_controller), |
| 253 top_level_item_list_(top_level_item_list), | 244 top_level_item_list_(top_level_item_list), |
| 254 clock_(std::move(clock)), | 245 clock_(std::move(clock)), |
| 255 update_results_factory_(this) { | 246 update_results_factory_(this) { |
| 256 data_sources_.push_back(scoped_ptr<DataSource>( | 247 data_sources_.push_back( |
| 257 new ExtensionDataSource(profile, this))); | 248 std::unique_ptr<DataSource>(new ExtensionDataSource(profile, this))); |
| 258 #if defined(OS_CHROMEOS) | 249 #if defined(OS_CHROMEOS) |
| 259 data_sources_.push_back(scoped_ptr<DataSource>( | 250 data_sources_.push_back( |
| 260 new ArcDataSource(profile, this))); | 251 std::unique_ptr<DataSource>(new ArcDataSource(profile, this))); |
| 261 #endif | 252 #endif |
| 262 | 253 |
| 263 RefreshApps(); | 254 RefreshApps(); |
| 264 } | 255 } |
| 265 | 256 |
| 266 AppSearchProvider::~AppSearchProvider() {} | 257 AppSearchProvider::~AppSearchProvider() {} |
| 267 | 258 |
| 268 void AppSearchProvider::Start(bool /*is_voice_query*/, | 259 void AppSearchProvider::Start(bool /*is_voice_query*/, |
| 269 const base::string16& query) { | 260 const base::string16& query) { |
| 270 query_ = query; | 261 query_ = query; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 298 ClearResults(); | 289 ClearResults(); |
| 299 | 290 |
| 300 if (show_recommendations) { | 291 if (show_recommendations) { |
| 301 // Build a map of app ids to their position in the app list. | 292 // Build a map of app ids to their position in the app list. |
| 302 std::map<std::string, size_t> id_to_app_list_index; | 293 std::map<std::string, size_t> id_to_app_list_index; |
| 303 for (size_t i = 0; i < top_level_item_list_->item_count(); ++i) { | 294 for (size_t i = 0; i < top_level_item_list_->item_count(); ++i) { |
| 304 id_to_app_list_index[top_level_item_list_->item_at(i)->id()] = i; | 295 id_to_app_list_index[top_level_item_list_->item_at(i)->id()] = i; |
| 305 } | 296 } |
| 306 | 297 |
| 307 for (auto& app : apps_) { | 298 for (auto& app : apps_) { |
| 308 scoped_ptr<AppResult> result = app->data_source()->CreateResult( | 299 std::unique_ptr<AppResult> result = app->data_source()->CreateResult( |
| 309 app->id(), list_controller_, top_level_item_list_, true); | 300 app->id(), list_controller_, top_level_item_list_, true); |
| 310 result->set_title(app->indexed_name().text()); | 301 result->set_title(app->indexed_name().text()); |
| 311 | 302 |
| 312 // Use the app list order to tiebreak apps that have never been launched. | 303 // Use the app list order to tiebreak apps that have never been launched. |
| 313 if (app->last_launch_time().is_null()) { | 304 if (app->last_launch_time().is_null()) { |
| 314 auto it = id_to_app_list_index.find(app->id()); | 305 auto it = id_to_app_list_index.find(app->id()); |
| 315 // If it's in a folder, it won't be in |id_to_app_list_index|. Rank | 306 // If it's in a folder, it won't be in |id_to_app_list_index|. Rank |
| 316 // those as if they are at the end of the list. | 307 // those as if they are at the end of the list. |
| 317 size_t app_list_index = | 308 size_t app_list_index = |
| 318 it == id_to_app_list_index.end() ? apps_.size() : (*it).second; | 309 it == id_to_app_list_index.end() ? apps_.size() : (*it).second; |
| 319 if (app_list_index > apps_.size()) | 310 if (app_list_index > apps_.size()) |
| 320 app_list_index = apps_.size(); | 311 app_list_index = apps_.size(); |
| 321 | 312 |
| 322 result->set_relevance(kUnlaunchedAppRelevanceStepSize * | 313 result->set_relevance(kUnlaunchedAppRelevanceStepSize * |
| 323 (apps_.size() - app_list_index)); | 314 (apps_.size() - app_list_index)); |
| 324 } else { | 315 } else { |
| 325 result->UpdateFromLastLaunched(clock_->Now(), app->last_launch_time()); | 316 result->UpdateFromLastLaunched(clock_->Now(), app->last_launch_time()); |
| 326 } | 317 } |
| 327 Add(std::move(result)); | 318 Add(std::move(result)); |
| 328 } | 319 } |
| 329 } else { | 320 } else { |
| 330 for (auto& app : apps_) { | 321 for (auto& app : apps_) { |
| 331 scoped_ptr<AppResult> result = app->data_source()->CreateResult( | 322 std::unique_ptr<AppResult> result = app->data_source()->CreateResult( |
| 332 app->id(), list_controller_, top_level_item_list_, false); | 323 app->id(), list_controller_, top_level_item_list_, false); |
| 333 TokenizedStringMatch match; | 324 TokenizedStringMatch match; |
| 334 if (!match.Calculate(query_terms, app->indexed_name())) | 325 if (!match.Calculate(query_terms, app->indexed_name())) |
| 335 continue; | 326 continue; |
| 336 | 327 |
| 337 result->UpdateFromMatch(app->indexed_name(), match); | 328 result->UpdateFromMatch(app->indexed_name(), match); |
| 338 Add(std::move(result)); | 329 Add(std::move(result)); |
| 339 } | 330 } |
| 340 } | 331 } |
| 341 | 332 |
| 342 update_results_factory_.InvalidateWeakPtrs(); | 333 update_results_factory_.InvalidateWeakPtrs(); |
| 343 } | 334 } |
| 344 | 335 |
| 345 void AppSearchProvider::RefreshAppsAndUpdateResults(bool force_inline) { | 336 void AppSearchProvider::RefreshAppsAndUpdateResults(bool force_inline) { |
| 346 RefreshApps(); | 337 RefreshApps(); |
| 347 | 338 |
| 348 if (force_inline) { | 339 if (force_inline) { |
| 349 UpdateResults(); | 340 UpdateResults(); |
| 350 } else { | 341 } else { |
| 351 if (!update_results_factory_.HasWeakPtrs()) { | 342 if (!update_results_factory_.HasWeakPtrs()) { |
| 352 base::ThreadTaskRunnerHandle::Get()->PostTask( | 343 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 353 FROM_HERE, base::Bind(&AppSearchProvider::UpdateResults, | 344 FROM_HERE, base::Bind(&AppSearchProvider::UpdateResults, |
| 354 update_results_factory_.GetWeakPtr())); | 345 update_results_factory_.GetWeakPtr())); |
| 355 } | 346 } |
| 356 } | 347 } |
| 357 } | 348 } |
| 358 | 349 |
| 359 } // namespace app_list | 350 } // namespace app_list |
| OLD | NEW |