athena: Introduce ActivityView.

ActivityViewModel has the necessary information that should be displayed to the
user. So provide mechanism for it to be able to update the view when the relevant
information (e.g. title, icon, color) changes.

BUG=none
R=oshima@chromium.org

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

Cr-Commit-Position: refs/heads/master@{#302753}
parent acd282e8
......@@ -59,11 +59,17 @@ ActivityFrameView::ActivityFrameView(views::Widget* frame,
UpdateWindowTitle();
UpdateWindowIcon();
view_model_->SetActivityView(this);
WindowManager::Get()->AddObserver(this);
}
ActivityFrameView::~ActivityFrameView() {
WindowManager::Get()->RemoveObserver(this);
// |view_model_| is already destroyed at this time. So do not attempt to reset
// the activity-view by calling SetActivityView(nullptr);
// http://crbug.com/427113
}
gfx::Rect ActivityFrameView::GetBoundsForClientView() const {
......@@ -169,6 +175,18 @@ void ActivityFrameView::OnPaintBackground(gfx::Canvas* canvas) {
canvas->DrawRect(border_bounds, SkColorSetA(SK_ColorGRAY, 0x7f));
}
void ActivityFrameView::UpdateTitle() {
UpdateWindowTitle();
}
void ActivityFrameView::UpdateIcon() {
UpdateWindowIcon();
}
void ActivityFrameView::UpdateRepresentativeColor() {
UpdateWindowTitle();
}
void ActivityFrameView::OnOverviewModeEnter() {
view_model_->PrepareContentsForOverview();
in_overview_ = true;
......
......@@ -5,6 +5,7 @@
#ifndef ATHENA_ACTIVITY_ACTIVITY_FRAME_VIEW_H_
#define ATHENA_ACTIVITY_ACTIVITY_FRAME_VIEW_H_
#include "athena/activity/public/activity_view.h"
#include "athena/wm/public/window_manager_observer.h"
#include "ui/gfx/insets.h"
#include "ui/views/window/non_client_view.h"
......@@ -21,7 +22,8 @@ class ActivityViewModel;
// A NonClientFrameView used for activity.
class ActivityFrameView : public views::NonClientFrameView,
public WindowManagerObserver {
public WindowManagerObserver,
public ActivityView {
public:
// The frame class name.
static const char kViewClassName[];
......@@ -47,6 +49,11 @@ class ActivityFrameView : public views::NonClientFrameView,
void OnPaintBackground(gfx::Canvas* canvas) override;
private:
// ActivityView:
void UpdateTitle() override;
void UpdateIcon() override;
void UpdateRepresentativeColor() override;
// WindowManagerObserver:
void OnOverviewModeEnter() override;
void OnOverviewModeExit() override;
......
......@@ -91,12 +91,6 @@ void ActivityManagerImpl::RemoveActivity(Activity* activity) {
}
}
void ActivityManagerImpl::UpdateActivity(Activity* activity) {
views::Widget* widget = GetWidget(activity);
widget->UpdateWindowIcon();
widget->UpdateWindowTitle();
}
const ActivityList& ActivityManagerImpl::GetActivityList() {
return activities_;
}
......
......@@ -27,7 +27,6 @@ class ActivityManagerImpl : public ActivityManager,
// ActivityManager:
void AddActivity(Activity* activity) override;
void RemoveActivity(Activity* activity) override;
void UpdateActivity(Activity* activity) override;
const ActivityList& GetActivityList() override;
Activity* GetActivityForWindow(aura::Window* window) override;
void AddObserver(ActivityManagerObserver* observer) override;
......
......@@ -50,11 +50,6 @@ views::View* ActivityWidgetDelegate::GetContentsView() {
return view_model_->GetContentsView();
}
views::ClientView* ActivityWidgetDelegate::CreateClientView(
views::Widget* widget) {
return new views::ClientView(widget, view_model_->GetContentsView());
}
views::NonClientFrameView* ActivityWidgetDelegate::CreateNonClientFrameView(
views::Widget* widget) {
return new ActivityFrameView(widget, view_model_);
......
......@@ -27,7 +27,6 @@ class ActivityWidgetDelegate : public views::WidgetDelegate {
views::Widget* GetWidget() override;
const views::Widget* GetWidget() const override;
views::View* GetContentsView() override;
views::ClientView* CreateClientView(views::Widget* widget) override;
views::NonClientFrameView* CreateNonClientFrameView(
views::Widget* widget) override;
......
......@@ -33,9 +33,6 @@ class ATHENA_EXPORT ActivityManager {
virtual void AddActivity(Activity* activity) = 0;
virtual void RemoveActivity(Activity* activity) = 0;
// Updates the UI when the task color/title changes.
virtual void UpdateActivity(Activity* activity) = 0;
// Returns a list of activities, sorted in their activation order (the most
// recently used activity is at the front of the returned list).
virtual const ActivityList& GetActivityList() = 0;
......
// 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_ACTIVITY_PUBLIC_ACTIVITY_VIEW_H_
#define ATHENA_ACTIVITY_PUBLIC_ACTIVITY_VIEW_H_
#include "athena/athena_export.h"
namespace athena {
class ATHENA_EXPORT ActivityView {
public:
virtual ~ActivityView() {}
virtual void UpdateTitle() = 0;
virtual void UpdateIcon() = 0;
virtual void UpdateRepresentativeColor() = 0;
};
} // namespace athena
#endif // ATHENA_ACTIVITY_PUBLIC_ACTIVITY_VIEW_H_
......@@ -21,6 +21,8 @@ class Widget;
namespace athena {
class ActivityView;
// The view model for the representation of the activity.
class ATHENA_EXPORT ActivityViewModel {
public:
......@@ -41,6 +43,10 @@ class ATHENA_EXPORT ActivityViewModel {
// Returns an icon for the activity.
virtual gfx::ImageSkia GetIcon() const = 0;
// Sets the ActivityView for the model to update. The model does not take
// ownership of the view.
virtual void SetActivityView(ActivityView* view) = 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;
......
......@@ -48,6 +48,7 @@
'activity/public/activity_factory.h',
'activity/public/activity_manager.h',
'activity/public/activity_manager_observer.h',
'activity/public/activity_view.h',
'activity/public/activity_view_model.h',
'athena_export.h',
'env/athena_env_impl.cc',
......
......@@ -5,6 +5,7 @@
#include "athena/content/app_activity.h"
#include "athena/activity/public/activity_manager.h"
#include "athena/activity/public/activity_view.h"
#include "athena/content/app_activity_registry.h"
#include "athena/content/content_proxy.h"
#include "athena/content/media_utils.h"
......@@ -24,7 +25,8 @@ AppActivity::AppActivity(const std::string& app_id, views::WebView* web_view)
: app_id_(app_id),
web_view_(web_view),
current_state_(ACTIVITY_UNLOADED),
app_activity_registry_(nullptr) {
app_activity_registry_(nullptr),
activity_view_(nullptr) {
Observe(web_view->GetWebContents());
}
......@@ -166,6 +168,11 @@ gfx::ImageSkia AppActivity::GetIcon() const {
return gfx::ImageSkia();
}
void AppActivity::SetActivityView(ActivityView* view) {
DCHECK(!activity_view_);
activity_view_ = view;
}
bool AppActivity::UsesFrame() const {
return false;
}
......@@ -200,7 +207,8 @@ AppActivity::AppActivity(const std::string& app_id)
: app_id_(app_id),
web_view_(nullptr),
current_state_(ACTIVITY_UNLOADED),
app_activity_registry_(nullptr) {
app_activity_registry_(nullptr),
activity_view_(nullptr) {
}
AppActivity::~AppActivity() {
......@@ -211,12 +219,14 @@ AppActivity::~AppActivity() {
void AppActivity::TitleWasSet(content::NavigationEntry* entry,
bool explicit_set) {
ActivityManager::Get()->UpdateActivity(this);
if (activity_view_)
activity_view_->UpdateTitle();
}
void AppActivity::DidUpdateFaviconURL(
const std::vector<content::FaviconURL>& candidates) {
ActivityManager::Get()->UpdateActivity(this);
if (activity_view_)
activity_view_->UpdateIcon();
}
// Register an |activity| with an application.
......
......@@ -44,6 +44,7 @@ class AppActivity : public Activity,
SkColor GetRepresentativeColor() const override;
base::string16 GetTitle() const override;
gfx::ImageSkia GetIcon() const override;
void SetActivityView(ActivityView* activity_view) override;
bool UsesFrame() const override;
views::View* GetContentsView() override;
gfx::ImageSkia GetOverviewModeImage() override;
......@@ -86,6 +87,11 @@ class AppActivity : public Activity,
// The content proxy.
scoped_ptr<ContentProxy> content_proxy_;
// WebActivity does not take ownership of |activity_view_|. If the view is
// destroyed before the activity, then it must be reset using
// SetActivityView(nullptr).
ActivityView* activity_view_;
DISALLOW_COPY_AND_ASSIGN(AppActivity);
};
......
......@@ -84,6 +84,9 @@ gfx::ImageSkia AppActivityProxy::GetIcon() const {
return gfx::ImageSkia();
}
void AppActivityProxy::SetActivityView(ActivityView* view) {
}
bool AppActivityProxy::UsesFrame() const {
return true;
}
......
......@@ -43,6 +43,7 @@ class AppActivityProxy : public Activity,
SkColor GetRepresentativeColor() const override;
base::string16 GetTitle() const override;
gfx::ImageSkia GetIcon() const override;
void SetActivityView(ActivityView* activity_view) override;
bool UsesFrame() const override;
views::View* GetContentsView() override;
gfx::ImageSkia GetOverviewModeImage() override;
......
......@@ -6,6 +6,7 @@
#include "athena/activity/public/activity_factory.h"
#include "athena/activity/public/activity_manager.h"
#include "athena/activity/public/activity_view.h"
#include "athena/content/content_proxy.h"
#include "athena/content/media_utils.h"
#include "athena/content/public/dialogs.h"
......@@ -441,6 +442,7 @@ WebActivity::WebActivity(content::BrowserContext* browser_context,
title_(title),
title_color_(kDefaultTitleColor),
current_state_(ACTIVITY_UNLOADED),
activity_view_(nullptr),
weak_ptr_factory_(this) {
// Order is important. The web activity helpers must be attached prior to the
// RenderView being created.
......@@ -453,6 +455,7 @@ WebActivity::WebActivity(content::WebContents* contents)
web_view_(new AthenaWebView(contents, this)),
title_color_(kDefaultTitleColor),
current_state_(ACTIVITY_UNLOADED),
activity_view_(nullptr),
weak_ptr_factory_(this) {
// If the activity was created as a result of
// WebContentsDelegate::AddNewContents(), web activity helpers may not be
......@@ -557,6 +560,11 @@ gfx::ImageSkia WebActivity::GetIcon() const {
return icon_;
}
void WebActivity::SetActivityView(ActivityView* view) {
DCHECK(!activity_view_);
activity_view_ = view;
}
bool WebActivity::UsesFrame() const {
return true;
}
......@@ -589,7 +597,8 @@ void WebActivity::ResetContentsView() {
void WebActivity::TitleWasSet(content::NavigationEntry* entry,
bool explicit_set) {
ActivityManager::Get()->UpdateActivity(this);
if (activity_view_)
activity_view_->UpdateTitle();
}
void WebActivity::DidNavigateMainFrame(
......@@ -599,7 +608,8 @@ void WebActivity::DidNavigateMainFrame(
weak_ptr_factory_.InvalidateWeakPtrs();
icon_ = gfx::ImageSkia();
ActivityManager::Get()->UpdateActivity(this);
if (activity_view_)
activity_view_->UpdateIcon();
}
void WebActivity::DidUpdateFaviconURL(
......@@ -629,12 +639,14 @@ void WebActivity::OnDidDownloadFavicon(
const std::vector<gfx::Size>& original_bitmap_sizes) {
icon_ = CreateFaviconImageSkia(
bitmaps, original_bitmap_sizes, kIconSize, nullptr);
ActivityManager::Get()->UpdateActivity(this);
if (activity_view_)
activity_view_->UpdateIcon();
}
void WebActivity::DidChangeThemeColor(SkColor theme_color) {
title_color_ = theme_color;
ActivityManager::Get()->UpdateActivity(this);
if (activity_view_)
activity_view_->UpdateRepresentativeColor();
}
void WebActivity::HideContentProxy() {
......
......@@ -62,6 +62,7 @@ class WebActivity : public Activity,
SkColor GetRepresentativeColor() const override;
base::string16 GetTitle() const override;
gfx::ImageSkia GetIcon() const override;
void SetActivityView(ActivityView* activity_view) override;
bool UsesFrame() const override;
views::View* GetContentsView() override;
gfx::ImageSkia GetOverviewModeImage() override;
......@@ -105,6 +106,11 @@ class WebActivity : public Activity,
// The content proxy.
scoped_ptr<ContentProxy> content_proxy_;
// WebActivity does not take ownership of |activity_view_|. If the view is
// destroyed before the activity, then it must be reset using
// SetActivityView(nullptr).
ActivityView* activity_view_;
base::WeakPtrFactory<WebActivity> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(WebActivity);
......
......@@ -72,6 +72,9 @@ gfx::ImageSkia SampleActivity::GetIcon() const {
return gfx::ImageSkia();
}
void SampleActivity::SetActivityView(ActivityView* view) {
}
bool SampleActivity::UsesFrame() const {
return true;
}
......
......@@ -40,6 +40,7 @@ class SampleActivity : public Activity,
SkColor GetRepresentativeColor() const override;
base::string16 GetTitle() const override;
gfx::ImageSkia GetIcon() const override;
void SetActivityView(ActivityView* activity_view) override;
bool UsesFrame() const override;
views::View* GetContentsView() override;
gfx::ImageSkia GetOverviewModeImage() 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