Commit 04b533d6 authored by mukai@chromium.org's avatar mukai@chromium.org

AppModelBuilder to athena.

AppModelBuilder creates the list of applications in the home card.
Right now app_list doesn't have such API, so the interface is in
athena. It would be integrated with other app builders eventually.

BUG=380421
R=oshima@chromium.org
TBR=xiyuan@chromium.org
TEST=manually

Review URL: https://codereview.chromium.org/311113005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276618 0039d316-1c4b-4281-b951-d872f2087c98
parent c36cde99
......@@ -31,6 +31,10 @@ class ATHENA_EXPORT ActivityFactory {
// Create an activity of a web page.
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const GURL& url) = 0;
// Create an activity of an app.
virtual Activity* CreateAppActivity(content::BrowserContext* browser_context,
const std::string& app_id) = 0;
};
} // namespace athena
......
......@@ -38,6 +38,7 @@
'home/app_list_view_delegate.cc',
'home/app_list_view_delegate.h',
'home/home_card_impl.cc',
'home/public/app_model_builder.h',
'home/public/home_card.h',
'input/public/input_manager.h',
'input/public/accelerator_manager.h',
......@@ -62,6 +63,7 @@
'dependencies': [
'athena_lib',
'../content/content.gyp:content_browser',
'../ui/app_list/app_list.gyp:app_list',
'../ui/views/controls/webview/webview.gyp:webview',
'../skia/skia.gyp:skia',
],
......@@ -70,7 +72,9 @@
],
'sources': [
'content/public/content_activity_factory.h',
'content/public/content_app_model_builder.h',
'content/content_activity_factory.cc',
'content/content_app_model_builder.cc',
'content/web_activity.h',
'content/web_activity.cc',
],
......@@ -83,6 +87,7 @@
'../skia/skia.gyp:skia',
'../testing/gtest.gyp:gtest',
'../ui/accessibility/accessibility.gyp:ax_gen',
'../ui/app_list/app_list.gyp:app_list',
'../ui/aura/aura.gyp:aura_test_support',
'../ui/base/ui_base.gyp:ui_base_test_support',
'../ui/compositor/compositor.gyp:compositor_test_support',
......@@ -104,6 +109,8 @@
'test/sample_activity.h',
'test/sample_activity_factory.cc',
'test/sample_activity_factory.h',
'test/test_app_model_builder.cc',
'test/test_app_model_builder.h',
],
},
{
......
include_rules = [
"+athena/activity/public",
"+athena/home/public",
"+content/public",
"+ui/app_list",
"+ui/views/controls/webview",
]
......@@ -5,6 +5,7 @@
#include "athena/content/public/content_activity_factory.h"
#include "athena/content/web_activity.h"
#include "base/logging.h"
namespace athena {
......@@ -19,4 +20,25 @@ Activity* ContentActivityFactory::CreateWebActivity(
return new WebActivity(browser_context, url);
}
Activity* ContentActivityFactory::CreateAppActivity(
content::BrowserContext* browser_context,
const std::string& app_id) {
// TODO(mukai): port the extension system and launch the app actually.
GURL url;
if (app_id == "mail")
url = GURL("https://mail.google.com/");
else if (app_id == "calendar")
url = GURL("https://calendar.google.com/");
else if (app_id == "video")
url = GURL("http://youtube.com/");
else if (app_id == "music")
url = GURL("https://play.google.com/music");
else if (app_id == "contact")
url = GURL("https://www.google.com/contacts");
else
LOG(FATAL) << "Unknown app id: " << app_id;
DCHECK(!url.is_empty());
return CreateWebActivity(browser_context, url);
}
} // namespace athena
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "athena/content/public/content_app_model_builder.h"
#include "athena/activity/public/activity_factory.h"
#include "athena/activity/public/activity_manager.h"
#include "ui/app_list/app_list_item.h"
#include "ui/app_list/app_list_model.h"
namespace athena {
namespace {
const int kIconSize = 64;
// Same dummy item.
class DummyItem : public app_list::AppListItem {
public:
DummyItem(const std::string& id,
SkColor color,
content::BrowserContext* browser_context)
: app_list::AppListItem(id),
id_(id),
browser_context_(browser_context) {
SkBitmap bitmap;
bitmap.setConfig(SkBitmap::kARGB_8888_Config, kIconSize, kIconSize);
bitmap.allocPixels();
bitmap.eraseColor(color);
SetIcon(gfx::ImageSkia::CreateFrom1xBitmap(bitmap), false /* has_shadow */);
SetName(id);
}
private:
// Overridden from app_list::AppListItem:
virtual void Activate(int event_flags) OVERRIDE {
ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateAppActivity(
browser_context_, id_));
}
std::string id_;
content::BrowserContext* browser_context_;
DISALLOW_COPY_AND_ASSIGN(DummyItem);
};
} // namespace
ContentAppModelBuilder::ContentAppModelBuilder(
content::BrowserContext* browser_context)
: browser_context_(browser_context) {
}
ContentAppModelBuilder::~ContentAppModelBuilder() {
}
void ContentAppModelBuilder::PopulateApps(app_list::AppListModel* model) {
model->AddItem(scoped_ptr<app_list::AppListItem>(
new DummyItem("mail", SK_ColorRED, browser_context_)));
model->AddItem(scoped_ptr<app_list::AppListItem>(
new DummyItem("calendar", SK_ColorBLUE, browser_context_)));
model->AddItem(scoped_ptr<app_list::AppListItem>(
new DummyItem("video", SK_ColorGREEN, browser_context_)));
model->AddItem(scoped_ptr<app_list::AppListItem>(
new DummyItem("music", SK_ColorYELLOW, browser_context_)));
model->AddItem(scoped_ptr<app_list::AppListItem>(
new DummyItem("contact", SK_ColorCYAN, browser_context_)));
}
} // namespace athena
......@@ -19,6 +19,8 @@ class ATHENA_EXPORT ContentActivityFactory : public ActivityFactory {
// Overridden from ActivityFactory:
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const GURL& url) OVERRIDE;
virtual Activity* CreateAppActivity(content::BrowserContext* browser_context,
const std::string& app_id) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(ContentActivityFactory);
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ATHENA_CONTENT_PUBLIC_CONTENT_APP_MODEL_BUILDER_H_
#define ATHENA_CONTENT_PUBLIC_CONTENT_APP_MODEL_BUILDER_H_
#include "athena/home/public/app_model_builder.h"
#include "base/macros.h"
namespace content {
class BrowserContext;
}
namespace athena {
class ATHENA_EXPORT ContentAppModelBuilder : public AppModelBuilder {
public:
explicit ContentAppModelBuilder(content::BrowserContext* browser_context);
virtual ~ContentAppModelBuilder();
virtual void PopulateApps(app_list::AppListModel* model) OVERRIDE;
private:
content::BrowserContext* browser_context_;
DISALLOW_COPY_AND_ASSIGN(ContentAppModelBuilder);
};
} // namespace athena
#endif // ATHENA_CONTENT_PUBLIC_CONTENT_APP_MODEL_BUILDER_H_
......@@ -6,13 +6,12 @@
#include <string>
#include "athena/home/public/app_model_builder.h"
#include "base/basictypes.h"
#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/strings/utf_string_conversions.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/app_list/app_list_item.h"
#include "ui/app_list/app_list_item_list.h"
#include "ui/app_list/app_list_model.h"
#include "ui/app_list/search_box_model.h"
#include "ui/app_list/search_result.h"
......@@ -21,93 +20,11 @@
namespace athena {
namespace {
const int kIconSize = 64;
class DummyItem : public app_list::AppListItem {
public:
enum Type {
DUMMY_MAIL,
DUMMY_CALENDAR,
DUMMY_VIDEO,
DUMMY_MUSIC,
DUMMY_CONTACT,
LAST_TYPE,
};
static std::string GetTitle(Type type) {
switch (type) {
case DUMMY_MAIL:
return "mail";
case DUMMY_CALENDAR:
return "calendar";
case DUMMY_VIDEO:
return "video";
case DUMMY_MUSIC:
return "music";
case DUMMY_CONTACT:
return "contact";
case LAST_TYPE:
break;
}
NOTREACHED();
return "";
}
static std::string GetId(Type type) {
return std::string("id-") + GetTitle(type);
}
explicit DummyItem(Type type)
: app_list::AppListItem(GetId(type)),
type_(type) {
SetIcon(GetIcon(), false /* has_shadow */);
SetName(GetTitle(type_));
}
private:
gfx::ImageSkia GetIcon() const {
SkColor color = SK_ColorWHITE;
switch (type_) {
case DUMMY_MAIL:
color = SK_ColorRED;
break;
case DUMMY_CALENDAR:
color = SK_ColorBLUE;
break;
case DUMMY_VIDEO:
color = SK_ColorGREEN;
break;
case DUMMY_MUSIC:
color = SK_ColorYELLOW;
break;
case DUMMY_CONTACT:
color = SK_ColorCYAN;
break;
case LAST_TYPE:
NOTREACHED();
break;
}
SkBitmap bitmap;
bitmap.setConfig(SkBitmap::kARGB_8888_Config, kIconSize, kIconSize);
bitmap.allocPixels();
bitmap.eraseColor(color);
return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
}
Type type_;
DISALLOW_COPY_AND_ASSIGN(DummyItem);
};
} // namespace
AppListViewDelegate::AppListViewDelegate()
AppListViewDelegate::AppListViewDelegate(AppModelBuilder* model_builder)
: model_(new app_list::AppListModel),
speech_ui_(new app_list::SpeechUIModel(
app_list::SPEECH_RECOGNITION_OFF)) {
PopulateApps();
model_builder->PopulateApps(model_.get());
// TODO(mukai): get the text from the resources.
model_->search_box()->SetHintText(base::ASCIIToUTF16("Search"));
}
......@@ -115,13 +32,6 @@ AppListViewDelegate::AppListViewDelegate()
AppListViewDelegate::~AppListViewDelegate() {
}
void AppListViewDelegate::PopulateApps() {
for (int i = 0; i < static_cast<int>(DummyItem::LAST_TYPE); ++i) {
model_->AddItem(scoped_ptr<app_list::AppListItem>(
new DummyItem(static_cast<DummyItem::Type>(i))));
}
}
bool AppListViewDelegate::ForceNativeDesktop() const {
return false;
}
......
......@@ -10,15 +10,14 @@
#include "ui/app_list/app_list_view_delegate.h"
namespace athena {
class AppModelBuilder;
class AppListViewDelegate : public app_list::AppListViewDelegate {
public:
AppListViewDelegate();
explicit AppListViewDelegate(AppModelBuilder* model_builder);
virtual ~AppListViewDelegate();
private:
void PopulateApps();
// Overridden from app_list::AppListViewDelegate:
virtual bool ForceNativeDesktop() const OVERRIDE;
virtual void SetProfileByPath(const base::FilePath& profile_path) OVERRIDE;
......
......@@ -5,6 +5,7 @@
#include "athena/home/public/home_card.h"
#include "athena/home/app_list_view_delegate.h"
#include "athena/home/public/app_model_builder.h"
#include "athena/input/public/accelerator_manager.h"
#include "athena/screen/public/screen_manager.h"
#include "ui/app_list/pagination_model.h"
......@@ -71,7 +72,7 @@ class HomeCardLayoutManager : public aura::LayoutManager {
class HomeCardImpl : public HomeCard, public AcceleratorHandler {
public:
HomeCardImpl();
explicit HomeCardImpl(AppModelBuilder* model_builder);
virtual ~HomeCardImpl();
void Init();
......@@ -94,13 +95,16 @@ class HomeCardImpl : public HomeCard, public AcceleratorHandler {
return true;
}
scoped_ptr<AppModelBuilder> model_builder_;
views::Widget* home_card_widget_;
DISALLOW_COPY_AND_ASSIGN(HomeCardImpl);
};
HomeCardImpl::HomeCardImpl()
: home_card_widget_(NULL) {
HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder)
: model_builder_(model_builder),
home_card_widget_(NULL) {
DCHECK(!instance);
instance = this;
}
......@@ -120,7 +124,7 @@ void HomeCardImpl::Init() {
wm::SetChildWindowVisibilityChangesAnimated(container);
app_list::AppListView* view = new app_list::AppListView(
new AppListViewDelegate);
new AppListViewDelegate(model_builder_.get()));
view->InitAsBubbleAtFixedLocation(
container,
0 /* initial_apps_page */,
......@@ -143,8 +147,8 @@ void HomeCardImpl::InstallAccelerators() {
} // namespace
// static
HomeCard* HomeCard::Create() {
(new HomeCardImpl())->Init();
HomeCard* HomeCard::Create(AppModelBuilder* model_builder) {
(new HomeCardImpl(model_builder))->Init();
DCHECK(instance);
return instance;
}
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ATHENA_HOME_PUBLIC_APP_MODEL_BUILDER_H_
#define ATHENA_HOME_PUBLIC_APP_MODEL_BUILDER_H_
#include "athena/athena_export.h"
namespace app_list {
class AppListModel;
} // namespace app_list
namespace athena {
// An interface to fill the list of apps in the home card.
// TODO(mukai): integrate the interface with chrome/browser/ui/app_list/
// extension_app_model_builder.
class ATHENA_EXPORT AppModelBuilder {
public:
virtual ~AppModelBuilder() {}
// Fills |model| with the currently available app_list::AppListItems.
virtual void PopulateApps(app_list::AppListModel* model) = 0;
};
} // namespace athena
#endif // ATHENA_HOME_PUBLIC_APP_MODEL_BUILDER_H_
......@@ -8,12 +8,13 @@
#include "athena/athena_export.h"
namespace athena {
class AppModelBuilder;
class ATHENA_EXPORT HomeCard {
public:
// Creates and deletes the singleton object of the HomeCard
// implementation.
static HomeCard* Create();
// implementation. Takes the ownership of |model_builder|.
static HomeCard* Create(AppModelBuilder* model_builder);
static void Shutdown();
virtual ~HomeCard() {}
......
......@@ -37,7 +37,8 @@ DEFINE_OWNED_WINDOW_PROPERTY_KEY(athena::RootWindowState,
NULL);
void StartAthena(aura::Window* root_window,
athena::ActivityFactory* activity_factory) {
athena::ActivityFactory* activity_factory,
athena::AppModelBuilder* app_model_builder) {
#if defined(USE_X11)
ui::TouchFactory::SetTouchDeviceListFromCommandLine();
#endif
......@@ -51,7 +52,7 @@ void StartAthena(aura::Window* root_window,
athena::InputManager::Create()->OnRootWindowCreated(root_window);
athena::ScreenManager::Create(root_window);
athena::WindowManager::Create();
athena::HomeCard::Create();
athena::HomeCard::Create(app_model_builder);
athena::ActivityManager::Create();
athena::ActivityFactory::RegisterActivityFactory(activity_factory);
SetupBackgroundImage();
......
......@@ -11,10 +11,12 @@ class Window;
namespace athena {
class ActivityFactory;
class AppModelBuilder;
// Starts/shuts down the athena shell environment.
void StartAthena(aura::Window* root_window,
ActivityFactory* activity_factory);
ActivityFactory* activity_factory,
AppModelBuilder* app_model_builder);
void ShutdownAthena();
} // namespace athena
......
......@@ -7,6 +7,7 @@
#include "apps/shell/browser/shell_desktop_controller.h"
#include "apps/shell/browser/shell_extension_system.h"
#include "athena/content/public/content_activity_factory.h"
#include "athena/content/public/content_app_model_builder.h"
#include "athena/main/athena_launcher.h"
#include "athena/main/placeholder.h"
#include "base/command_line.h"
......@@ -28,7 +29,8 @@ class AthenaBrowserMainDelegate : public apps::ShellBrowserMainDelegate {
virtual void Start(content::BrowserContext* context) OVERRIDE {
athena::StartAthena(
apps::ShellDesktopController::instance()->host()->window(),
new athena::ContentActivityFactory());
new athena::ContentActivityFactory(),
new athena::ContentAppModelBuilder(context));
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(kAppSwitch)) {
base::FilePath app_dir(command_line->GetSwitchValueNative(kAppSwitch));
......
include_rules = [
"+athena/activity",
"+athena/home/public",
"+athena/main",
"+third_party/skia/include",
"+ui/app_list",
"+ui/aura",
"+ui/base",
"+ui/compositor",
......
......@@ -6,6 +6,7 @@
#include "athena/main/athena_launcher.h"
#include "athena/test/sample_activity_factory.h"
#include "athena/test/test_app_model_builder.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "ui/aura/client/aura_constants.h"
......@@ -74,7 +75,9 @@ void AthenaTestHelper::SetUp(ui::ContextFactory* context_factory) {
// Ensure width != height so tests won't confuse them.
host()->SetBounds(gfx::Rect(800, 600));
athena::StartAthena(root_window(), new SampleActivityFactory());
athena::StartAthena(root_window(),
new SampleActivityFactory(),
new TestAppModelBuilder());
}
void AthenaTestHelper::TearDown() {
......
......@@ -17,6 +17,9 @@ namespace test {
namespace {
const SkColor kDefaultColor = SK_ColorRED;
const SkColor kDefaultContentColor = SK_ColorGREEN;
const SkColor kDefaultAppColor = SK_ColorYELLOW;
const SkColor kDefaultAppContentColor = SK_ColorBLUE;
}
SampleActivityFactory::SampleActivityFactory() {}
......@@ -30,5 +33,12 @@ Activity* SampleActivityFactory::CreateWebActivity(
kDefaultColor, kDefaultContentColor, base::UTF8ToUTF16(url.spec()));
}
Activity* SampleActivityFactory::CreateAppActivity(
content::BrowserContext* browser_context,
const std::string& app_id) {
return new SampleActivity(
kDefaultAppColor, kDefaultAppContentColor, base::UTF8ToUTF16(app_id));
}
} // namespace test
} // namespace athena
......@@ -19,6 +19,8 @@ class SampleActivityFactory : public ActivityFactory {
// Overridden from ActivityFactory:
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const GURL& url) OVERRIDE;
virtual Activity* CreateAppActivity(content::BrowserContext* browser_context,
const std::string& app_id) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(SampleActivityFactory);
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "athena/test/test_app_model_builder.h"
#include "ui/app_list/app_list_item.h"
#include "ui/app_list/app_list_model.h"
namespace athena {
namespace {
const int kIconSize = 64;
class DummyItem : public app_list::AppListItem {
public:
enum Type {
DUMMY_MAIL,
DUMMY_CALENDAR,
DUMMY_VIDEO,
DUMMY_MUSIC,
DUMMY_CONTACT,
LAST_TYPE,
};
static std::string GetTitle(Type type) {
switch (type) {
case DUMMY_MAIL:
return "mail";
case DUMMY_CALENDAR:
return "calendar";
case DUMMY_VIDEO:
return "video";
case DUMMY_MUSIC:
return "music";
case DUMMY_CONTACT:
return "contact";
case LAST_TYPE:
break;
}
NOTREACHED();
return "";
}
static std::string GetId(Type type) {
return std::string("id-") + GetTitle(type);
}
explicit DummyItem(Type type)
: app_list::AppListItem(GetId(type)),
type_(type) {
SetIcon(GetIcon(), false /* has_shadow */);
SetName(GetTitle(type_));
}
private:
gfx::ImageSkia GetIcon() const {
SkColor color = SK_ColorWHITE;
switch (type_) {
case DUMMY_MAIL:
color = SK_ColorRED;
break;
case DUMMY_CALENDAR:
color = SK_ColorBLUE;
break;
case DUMMY_VIDEO:
color = SK_ColorGREEN;
break;
case DUMMY_MUSIC:
color = SK_ColorYELLOW;
break;
case DUMMY_CONTACT:
color = SK_ColorCYAN;
break;
case LAST_TYPE:
NOTREACHED();
break;
}
SkBitmap bitmap;
bitmap.setConfig(SkBitmap::kARGB_8888_Config, kIconSize, kIconSize);
bitmap.allocPixels();
bitmap.eraseColor(color);
return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
}
Type type_;
DISALLOW_COPY_AND_ASSIGN(DummyItem);
};
} // namespace
TestAppModelBuilder::TestAppModelBuilder() {
}
TestAppModelBuilder::~TestAppModelBuilder() {
}
void TestAppModelBuilder::PopulateApps(app_list::AppListModel* model) {
for (int i = 0; i < static_cast<int>(DummyItem::LAST_TYPE); ++i) {
model->AddItem(scoped_ptr<app_list::AppListItem>(
new DummyItem(static_cast<DummyItem::Type>(i))));
}
}
} // namespace athena
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ATHENA_TEST_TEST_APP_MODEL_BUILDER_H_
#define ATHENA_TEST_TEST_APP_MODEL_BUILDER_H_
#include "athena/home/public/app_model_builder.h"
#include "base/macros.h"
namespace athena {
class TestAppModelBuilder : public AppModelBuilder {
public:
TestAppModelBuilder();
virtual ~TestAppModelBuilder();
// Overridden from AppModelBuilder:
virtual void PopulateApps(app_list::AppListModel* model) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(TestAppModelBuilder);
};
} // namespace athena
#endif // ATHENA_TEST_TEST_APP_MODEL_BUILDER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment