146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "athena/home/app_list_view_delegate.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string> 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <vector> 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "athena/home/public/app_model_builder.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/strings/grit/athena_strings.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/basictypes.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/callback.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/file_path.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/app_list/app_list_model.h" 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/app_list/search_box_model.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/app_list/search_provider.h" 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/app_list/search_result.h" 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/app_list/speech_ui_model.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/l10n/l10n_util.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/resource/resource_bundle.h" 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/resources/grit/ui_resources.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/image_view.h" 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace athena { 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)AppListViewDelegate::AppListViewDelegate(AppModelBuilder* model_builder) 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : model_(new app_list::AppListModel), 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci speech_ui_(new app_list::SpeechUIModel) { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) model_builder->PopulateApps(model_.get()); 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->search_box()->SetHintText( 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci l10n_util::GetStringUTF16(IDS_ATHENA_SEARCH_BOX_HINT)); 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)AppListViewDelegate::~AppListViewDelegate() { 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < search_providers_.size(); ++i) 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) search_providers_[i]->set_result_changed_callback(base::Closure()); 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void AppListViewDelegate::RegisterSearchProvider( 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_list::SearchProvider* search_provider) { 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Right now we allow only one provider. 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(mukai): port app-list's mixer and remove this restriction. 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(search_providers_.empty()); 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) search_provider->set_result_changed_callback(base::Bind( 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &AppListViewDelegate::SearchResultChanged, base::Unretained(this))); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) search_providers_.push_back(search_provider); 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void AppListViewDelegate::SearchResultChanged() { 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(mukai): port app-list's Mixer to reorder the results properly. 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_list::SearchProvider* search_provider = search_providers_[0]; 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<app_list::SearchResult*> results; 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) search_provider->ReleaseResult(&results); 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (results.empty()) { 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) model_->results()->DeleteAll(); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < results.size(); ++i) 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) model_->results()->Add(results[i]); 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool AppListViewDelegate::ForceNativeDesktop() const { 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::SetProfileByPath(const base::FilePath& profile_path) { 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done. 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)app_list::AppListModel* AppListViewDelegate::GetModel() { 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return model_.get(); 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)app_list::SpeechUIModel* AppListViewDelegate::GetSpeechUI() { 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return speech_ui_.get(); 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::GetShortcutPathForApp( 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& app_id, 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Callback<void(const base::FilePath&)>& callback) { 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Windows only, nothing is necessary. 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::StartSearch() { 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < search_providers_.size(); ++i) 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) search_providers_[i]->Start(model_->search_box()->text()); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::StopSearch() { 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < search_providers_.size(); ++i) 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) search_providers_[i]->Stop(); 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::OpenSearchResult(app_list::SearchResult* result, 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool auto_launch, 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int event_flags) { 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result->Open(event_flags); 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::InvokeSearchResultAction( 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) app_list::SearchResult* result, 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int action_index, 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int event_flags) { 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // TODO(mukai): implement this. 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::TimeDelta AppListViewDelegate::GetAutoLaunchTimeout() { 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Used by voice search, nothing needs to be done for now. 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return base::TimeDelta(); 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::AutoLaunchCanceled() { 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Used by voice search, nothing needs to be done for now. 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::ViewInitialized() { 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done. 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::Dismiss() { 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done. 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::ViewClosing() { 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done. 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)gfx::ImageSkia AppListViewDelegate::GetWindowIcon() { 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return gfx::ImageSkia(); 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::OpenSettings() { 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done for now. 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // TODO(mukai): should invoke the settings app. 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::OpenHelp() { 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done for now. 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // TODO(mukai): should invoke the help app. 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::OpenFeedback() { 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done for now. 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // TODO(mukai): should invoke the feedback app. 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::ToggleSpeechRecognition() { 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done. 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewDelegate::ShowForProfileByPath( 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::FilePath& profile_path) { 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Nothing needs to be done. 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)views::View* AppListViewDelegate::CreateStartPageWebView( 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const gfx::Size& size) { 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A static image of the logo. This needs to support dynamic Doodles 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // eventually. 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::ImageView* logo_image = new views::ImageView(); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci logo_image->SetImage(ui::ResourceBundle::GetSharedInstance(). 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetImageSkiaNamed(IDR_LOCAL_NTP_IMAGES_LOGO_PNG)); 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci logo_image->SetHorizontalAlignment(views::ImageView::CENTER); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci logo_image->SetVerticalAlignment(views::ImageView::CENTER); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return logo_image; 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::vector<views::View*> AppListViewDelegate::CreateCustomPageWebViews( 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Size& size) { 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return std::vector<views::View*>(); 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool AppListViewDelegate::IsSpeechRecognitionEnabled() { 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const app_list::AppListViewDelegate::Users& 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)AppListViewDelegate::GetUsers() const { 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return users_; 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool AppListViewDelegate::ShouldCenterWindow() const { 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace athena 191