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