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