Home | History | Annotate | Download | only in content
      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 
     23 ShellExtensionSystem* GetShellExtensionSystem(
     24     content::BrowserContext* context) {
     25   return static_cast<ShellExtensionSystem*>(
     26       extensions::ExtensionSystem::Get(context));
     27 }
     28 
     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:
     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:
     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:
     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:
     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 
    104 ContentAppModelBuilder::ContentAppModelBuilder(
    105     content::BrowserContext* browser_context)
    106     : browser_context_(browser_context) {
    107 }
    108 
    109 ContentAppModelBuilder::~ContentAppModelBuilder() {
    110 }
    111 
    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