1 // Copyright 2014 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 "athena/content/public/content_app_model_builder.h"
6
7 #include "apps/shell/browser/shell_extension_system.h"
8 #include "athena/activity/public/activity_factory.h"
9 #include "athena/activity/public/activity_manager.h"
10 #include "extensions/browser/extension_icon_image.h"
11 #include "extensions/common/constants.h"
12 #include "extensions/common/extension.h"
13 #include "extensions/common/manifest_handlers/icons_handler.h"
14 #include "ui/app_list/app_list_item.h"
15 #include "ui/app_list/app_list_model.h"
16
17 using extensions::ShellExtensionSystem;
18
19 namespace athena {
20
21 namespace {
22
GetShellExtensionSystem(content::BrowserContext * context)23 ShellExtensionSystem* GetShellExtensionSystem(
24 content::BrowserContext* context) {
25 return static_cast<ShellExtensionSystem*>(
26 extensions::ExtensionSystem::Get(context));
27 }
28
CreateFlatColorImage(SkColor color)29 gfx::ImageSkia CreateFlatColorImage(SkColor color) {
30 SkBitmap bitmap;
31 bitmap.setConfig(
32 SkBitmap::kARGB_8888_Config,
33 extension_misc::EXTENSION_ICON_MEDIUM,
34 extension_misc::EXTENSION_ICON_MEDIUM);
35 bitmap.allocPixels();
36 bitmap.eraseColor(color);
37 return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
38 }
39
40 // Same dummy item.
41 class DummyItem : public app_list::AppListItem {
42 public:
DummyItem(const std::string & id,const GURL & url,SkColor color,content::BrowserContext * browser_context)43 DummyItem(const std::string& id,
44 const GURL& url,
45 SkColor color,
46 content::BrowserContext* browser_context)
47 : app_list::AppListItem(id),
48 url_(url),
49 browser_context_(browser_context) {
50
51 SetIcon(CreateFlatColorImage(color), false /* has_shadow */);
52 SetName(id);
53 }
54
55 private:
56 // Overridden from app_list::AppListItem:
Activate(int event_flags)57 virtual void Activate(int event_flags) OVERRIDE {
58 ActivityManager::Get()->AddActivity(
59 ActivityFactory::Get()->CreateWebActivity(browser_context_, url_));
60 }
61
62 GURL url_;
63 content::BrowserContext* browser_context_;
64
65 DISALLOW_COPY_AND_ASSIGN(DummyItem);
66 };
67
68 class AppItem : public app_list::AppListItem {
69 public:
AppItem(scoped_refptr<extensions::Extension> extension,content::BrowserContext * browser_context)70 AppItem(scoped_refptr<extensions::Extension> extension,
71 content::BrowserContext* browser_context)
72 : app_list::AppListItem(extension->id()),
73 extension_(extension),
74 browser_context_(browser_context),
75 icon_image_(browser_context_,
76 extension.get(),
77 extensions::IconsInfo::GetIcons(extension.get()),
78 extension_misc::EXTENSION_ICON_MEDIUM,
79 // TODO(mukai): better default icon
80 CreateFlatColorImage(SK_ColorBLACK),
81 NULL) {
82 icon_image_.image_skia().EnsureRepsForSupportedScales();
83 SetIcon(icon_image_.image_skia(), false);
84 SetName(extension->name());
85 }
86
87 private:
88 // Overridden from app_list::AppListItem:
Activate(int event_flags)89 virtual void Activate(int event_flags) OVERRIDE {
90 // TODO(mukai): Pass |extension_| when the extension system supports
91 // multiple extensions.
92 GetShellExtensionSystem(browser_context_)->LaunchApp();
93 }
94
95 scoped_refptr<extensions::Extension> extension_;
96 content::BrowserContext* browser_context_;
97 extensions::IconImage icon_image_;
98
99 DISALLOW_COPY_AND_ASSIGN(AppItem);
100 };
101
102 } // namespace
103
ContentAppModelBuilder(content::BrowserContext * browser_context)104 ContentAppModelBuilder::ContentAppModelBuilder(
105 content::BrowserContext* browser_context)
106 : browser_context_(browser_context) {
107 }
108
~ContentAppModelBuilder()109 ContentAppModelBuilder::~ContentAppModelBuilder() {
110 }
111
PopulateApps(app_list::AppListModel * model)112 void ContentAppModelBuilder::PopulateApps(app_list::AppListModel* model) {
113 model->AddItem(scoped_ptr<app_list::AppListItem>(new DummyItem(
114 "mail", GURL("http://gmail.com/"), SK_ColorRED, browser_context_)));
115 model->AddItem(scoped_ptr<app_list::AppListItem>(new DummyItem(
116 "calendar", GURL("https://calendar.google.com/"),
117 SK_ColorBLUE, browser_context_)));
118 model->AddItem(scoped_ptr<app_list::AppListItem>(new DummyItem(
119 "video", GURL("http://youtube.com/"), SK_ColorGREEN, browser_context_)));
120 model->AddItem(scoped_ptr<app_list::AppListItem>(new DummyItem(
121 "music", GURL("http://play.google.com/music"),
122 SK_ColorYELLOW, browser_context_)));
123 model->AddItem(scoped_ptr<app_list::AppListItem>(new DummyItem(
124 "contact", GURL("https://www.google.com/contacts"),
125 SK_ColorCYAN, browser_context_)));
126
127 ShellExtensionSystem* extension_system =
128 GetShellExtensionSystem(browser_context_);
129 if (extension_system && extension_system->extension()) {
130 model->AddItem(scoped_ptr<app_list::AppListItem>(
131 new AppItem(extension_system->extension(), browser_context_)));
132 }
133 }
134
135 } // namespace athena
136