Commit 897d0428 authored by pkotwicz's avatar pkotwicz Committed by Commit bot

[Athena] Hack to display favicons for web activities in overview mode.

BUG=411631
TEST=None
TBR=oshima,sadrul (TBR for changes to athena/content/DEPS)

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

Cr-Commit-Position: refs/heads/master@{#294400}
parent bd6b2977
......@@ -6,7 +6,6 @@
#include "athena/activity/public/activity_view_model.h"
#include "athena/wm/public/window_manager.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/hit_test.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/image/image_skia.h"
......@@ -25,7 +24,7 @@ namespace {
const int kIconSize = 32;
// The distance between the icon and the title when the icon is visible.
const int kIconTitleSpacing = 5;
const int kIconTitleSpacing = 10;
// The height of the top border necessary to display the title without the icon.
const int kDefaultTitleHeight = 25;
......@@ -54,17 +53,11 @@ ActivityFrameView::ActivityFrameView(views::Widget* frame,
in_overview_(false) {
title_->SetEnabledColor(SkColorSetA(SK_ColorBLACK, 0xe5));
SkBitmap bitmap;
bitmap.allocN32Pixels(kIconSize, kIconSize);
bitmap.eraseARGB(255, 0, 255, 0);
icon_->SetImage(gfx::ImageSkia::CreateFrom1xBitmap(bitmap));
AddChildView(title_);
AddChildView(icon_);
SkColor bgcolor = view_model_->GetRepresentativeColor();
set_background(views::Background::CreateSolidBackground(bgcolor));
UpdateWindowTitle();
UpdateWindowIcon();
WindowManager::GetInstance()->AddObserver(this);
}
......@@ -105,12 +98,14 @@ void ActivityFrameView::ResetWindowControls() {
}
void ActivityFrameView::UpdateWindowIcon() {
if (!view_model_->UsesFrame())
return;
// The activity has a frame in overview mode regardless of the value of
// ActivityViewModel::UsesFrame().
SkColor bgcolor = view_model_->GetRepresentativeColor();
set_background(views::Background::CreateSolidBackground(bgcolor));
title_->SetBackgroundColor(bgcolor);
if (view_model_->UsesFrame())
icon_->SetImage(view_model_->GetIcon());
SchedulePaint();
}
......
......@@ -55,7 +55,6 @@ class ActivityViewManagerImpl : public ActivityViewManager,
views::Widget* container = CreateWidget(activity);
container->AddObserver(this);
activity_widgets_[activity] = container;
container->UpdateWindowTitle();
container->Show();
container->Activate();
// Call the Activity model's initializer. It might re-order the activity
......
......@@ -38,6 +38,9 @@ class ATHENA_EXPORT ActivityViewModel {
// Returns a title for the activity.
virtual base::string16 GetTitle() const = 0;
// Returns an icon for the activity.
virtual gfx::ImageSkia GetIcon() const = 0;
// True if the activity wants to use Widget's frame, or false if the activity
// draws its own frame.
virtual bool UsesFrame() const = 0;
......
......@@ -5,6 +5,7 @@ include_rules = [
"+athena/input/public",
"+athena/resource_manager/public",
"+athena/wm/public",
"+components/favicon_base",
"+components/renderer_context_menu",
"+components/web_modal",
"+content/public",
......
......@@ -110,6 +110,10 @@ base::string16 AppActivity::GetTitle() const {
return web_view_->GetWebContents()->GetTitle();
}
gfx::ImageSkia AppActivity::GetIcon() const {
return gfx::ImageSkia();
}
bool AppActivity::UsesFrame() const {
return false;
}
......
......@@ -37,6 +37,7 @@ class AppActivity : public Activity,
virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE;
virtual void CreateOverviewModeImage() OVERRIDE;
......
......@@ -76,6 +76,10 @@ base::string16 AppActivityProxy::GetTitle() const {
return title_;
}
gfx::ImageSkia AppActivityProxy::GetIcon() const {
return gfx::ImageSkia();
}
bool AppActivityProxy::UsesFrame() const {
return true;
}
......
......@@ -41,6 +41,7 @@ class AppActivityProxy : public Activity,
virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE;
virtual views::Widget* CreateWidget() OVERRIDE;
......
......@@ -11,11 +11,13 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/strings/utf_string_conversions.h"
#include "components/favicon_base/select_favicon_frames.h"
#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/favicon_url.h"
#include "ui/aura/window.h"
#include "ui/compositor/closure_animation_observer.h"
#include "ui/compositor/scoped_layer_animation_settings.h"
......@@ -146,6 +148,7 @@ class WebActivityController : public AcceleratorHandler {
const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2);
const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77);
const int kIconSize = 32;
} // namespace
......@@ -347,14 +350,16 @@ WebActivity::WebActivity(content::BrowserContext* browser_context,
url_(url),
web_view_(NULL),
title_color_(kDefaultTitleColor),
current_state_(ACTIVITY_UNLOADED) {
current_state_(ACTIVITY_UNLOADED),
weak_ptr_factory_(this) {
}
WebActivity::WebActivity(AthenaWebView* web_view)
: browser_context_(web_view->browser_context()),
url_(web_view->GetWebContents()->GetURL()),
web_view_(web_view),
current_state_(ACTIVITY_UNLOADED) {
current_state_(ACTIVITY_UNLOADED),
weak_ptr_factory_(this) {
// Transition to state ACTIVITY_INVISIBLE to perform the same setup steps
// as on new activities (namely adding a WebContentsObserver).
SetCurrentState(ACTIVITY_INVISIBLE);
......@@ -436,7 +441,6 @@ void WebActivity::Init() {
}
SkColor WebActivity::GetRepresentativeColor() const {
// TODO(sad): Compute the color from the favicon.
return web_view_ ? title_color_ : kDefaultUnavailableColor;
}
......@@ -449,6 +453,10 @@ base::string16 WebActivity::GetTitle() const {
: base::string16();
}
gfx::ImageSkia WebActivity::GetIcon() const {
return icon_;
}
bool WebActivity::UsesFrame() const {
return true;
}
......@@ -500,8 +508,43 @@ void WebActivity::TitleWasSet(content::NavigationEntry* entry,
ActivityManager::Get()->UpdateActivity(this);
}
void WebActivity::DidNavigateMainFrame(
const content::LoadCommittedDetails& details,
const content::FrameNavigateParams& params) {
// Prevent old image requests from calling back to OnDidDownloadFavicon().
weak_ptr_factory_.InvalidateWeakPtrs();
icon_ = gfx::ImageSkia();
ActivityManager::Get()->UpdateActivity(this);
}
void WebActivity::DidUpdateFaviconURL(
const std::vector<content::FaviconURL>& candidates) {
// Pick an arbitrary favicon of type FAVICON to use.
// TODO(pkotwicz): Do something better once the favicon code is componentized.
// (crbug.com/401997)
weak_ptr_factory_.InvalidateWeakPtrs();
for (size_t i = 0; i < candidates.size(); ++i) {
if (candidates[i].icon_type == content::FaviconURL::FAVICON) {
web_view_->GetWebContents()->DownloadImage(
candidates[i].icon_url,
true,
0,
base::Bind(&WebActivity::OnDidDownloadFavicon,
weak_ptr_factory_.GetWeakPtr()));
break;
}
}
}
void WebActivity::OnDidDownloadFavicon(
int id,
int http_status_code,
const GURL& url,
const std::vector<SkBitmap>& bitmaps,
const std::vector<gfx::Size>& original_bitmap_sizes) {
icon_ = CreateFaviconImageSkia(
bitmaps, original_bitmap_sizes, kIconSize, NULL);
ActivityManager::Get()->UpdateActivity(this);
}
......
......@@ -5,17 +5,26 @@
#ifndef ATHENA_CONTENT_PUBLIC_WEB_ACTIVITY_H_
#define ATHENA_CONTENT_PUBLIC_WEB_ACTIVITY_H_
#include <vector>
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_view_model.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "content/public/browser/web_contents_observer.h"
#include "ui/gfx/image/image_skia.h"
class SkBitmap;
namespace content {
class BrowserContext;
class WebContents;
}
namespace gfx {
class Size;
}
namespace views {
class WebView;
class WidgetDelegate;
......@@ -49,6 +58,7 @@ class WebActivity : public Activity,
virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE;
virtual views::Widget* CreateWidget() OVERRIDE;
......@@ -58,6 +68,9 @@ class WebActivity : public Activity,
virtual void ResetContentsView() OVERRIDE;
// content::WebContentsObserver:
virtual void DidNavigateMainFrame(
const content::LoadCommittedDetails& details,
const content::FrameNavigateParams& params) OVERRIDE;
virtual void TitleWasSet(content::NavigationEntry* entry,
bool explicit_set) OVERRIDE;
virtual void DidUpdateFaviconURL(
......@@ -65,6 +78,15 @@ class WebActivity : public Activity,
virtual void DidChangeThemeColor(SkColor theme_color) OVERRIDE;
private:
// Called when a favicon download initiated in DidUpdateFaviconURL()
// has completed.
void OnDidDownloadFavicon(
int id,
int http_status_code,
const GURL& url,
const std::vector<SkBitmap>& bitmaps,
const std::vector<gfx::Size>& original_bitmap_sizes);
// Make the content visible. This call should only be paired with
// MakeInvisible. Note: Upon object creation the content is visible.
void MakeVisible();
......@@ -78,6 +100,7 @@ class WebActivity : public Activity,
content::BrowserContext* browser_context_;
const base::string16 title_;
gfx::ImageSkia icon_;
const GURL url_;
AthenaWebView* web_view_;
SkColor title_color_;
......@@ -88,6 +111,8 @@ class WebActivity : public Activity,
// The image which will be used in overview mode.
gfx::ImageSkia overview_mode_image_;
base::WeakPtrFactory<WebActivity> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(WebActivity);
};
......
......@@ -51,6 +51,7 @@ class TestActivity : public Activity,
virtual void Init() OVERRIDE {}
virtual SkColor GetRepresentativeColor() const OVERRIDE { return 0; }
virtual base::string16 GetTitle() const OVERRIDE { return title_; }
virtual gfx::ImageSkia GetIcon() const OVERRIDE { return gfx::ImageSkia(); }
virtual bool UsesFrame() const OVERRIDE { return true; }
virtual views::View* GetContentsView() OVERRIDE { return view_; }
virtual views::Widget* CreateWidget() OVERRIDE { return NULL; }
......
......@@ -60,6 +60,10 @@ base::string16 SampleActivity::GetTitle() const {
return title_;
}
gfx::ImageSkia SampleActivity::GetIcon() const {
return gfx::ImageSkia();
}
bool SampleActivity::UsesFrame() const {
return true;
}
......
......@@ -34,6 +34,7 @@ class SampleActivity : public Activity,
virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE;
virtual views::Widget* CreateWidget() OVERRIDE;
......
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