Commit c856b9bf authored by oshima's avatar oshima Committed by Commit bot

Do not show the activity widget in ActivityManager::AddActivity

 * Instead, show it explicitly on caller side. This is necessary as the extensions system controls the app window's visibility.

Remove ActivityViewManager
 Instead of keeping activity -> widget map, use views::Widget::GetWidgetForNativeWindow

BUG=417017
TEST=ActivityManagerTest.Basic

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

Cr-Commit-Position: refs/heads/master@{#296524}
parent 8d01729a
...@@ -5,9 +5,18 @@ ...@@ -5,9 +5,18 @@
#include "athena/activity/public/activity.h" #include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_manager.h" #include "athena/activity/public/activity_manager.h"
#include "ui/views/widget/widget.h"
namespace athena { namespace athena {
// static
void Activity::Show(Activity* activity) {
views::Widget* widget =
views::Widget::GetWidgetForNativeWindow(activity->GetWindow());
DCHECK(widget);
widget->Show();
}
// static // static
void Activity::Delete(Activity* activity) { void Activity::Delete(Activity* activity) {
ActivityManager::Get()->RemoveActivity(activity); ActivityManager::Get()->RemoveActivity(activity);
......
...@@ -6,11 +6,13 @@ ...@@ -6,11 +6,13 @@
#include <algorithm> #include <algorithm>
#include "athena/activity/activity_widget_delegate.h"
#include "athena/activity/public/activity.h" #include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_manager_observer.h" #include "athena/activity/public/activity_manager_observer.h"
#include "athena/activity/public/activity_view_manager.h" #include "athena/activity/public/activity_view_model.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "ui/views/widget/widget.h"
namespace athena { namespace athena {
...@@ -18,6 +20,25 @@ namespace { ...@@ -18,6 +20,25 @@ namespace {
ActivityManager* instance = NULL; ActivityManager* instance = NULL;
views::Widget* CreateWidget(Activity* activity) {
ActivityViewModel* view_model = activity->GetActivityViewModel();
views::Widget* widget = view_model->CreateWidget();
if (widget)
return widget;
widget = new views::Widget;
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
params.delegate = new ActivityWidgetDelegate(view_model);
widget->Init(params);
activity->GetActivityViewModel()->Init();
return widget;
}
views::Widget* GetWidget(Activity* activity) {
CHECK(activity);
CHECK(activity->GetWindow());
return views::Widget::GetWidgetForNativeWindow(activity->GetWindow());
}
} // namespace } // namespace
ActivityManagerImpl::ActivityManagerImpl() { ActivityManagerImpl::ActivityManagerImpl() {
...@@ -37,8 +58,8 @@ void ActivityManagerImpl::AddActivity(Activity* activity) { ...@@ -37,8 +58,8 @@ void ActivityManagerImpl::AddActivity(Activity* activity) {
CHECK(activities_.end() == CHECK(activities_.end() ==
std::find(activities_.begin(), activities_.end(), activity)); std::find(activities_.begin(), activities_.end(), activity));
activities_.push_back(activity); activities_.push_back(activity);
ActivityViewManager* manager = ActivityViewManager::Get(); views::Widget* widget = CreateWidget(activity);
manager->AddActivity(activity); widget->AddObserver(this);
FOR_EACH_OBSERVER(ActivityManagerObserver, FOR_EACH_OBSERVER(ActivityManagerObserver,
observers_, observers_,
OnActivityStarted(activity)); OnActivityStarted(activity));
...@@ -47,19 +68,21 @@ void ActivityManagerImpl::AddActivity(Activity* activity) { ...@@ -47,19 +68,21 @@ void ActivityManagerImpl::AddActivity(Activity* activity) {
void ActivityManagerImpl::RemoveActivity(Activity* activity) { void ActivityManagerImpl::RemoveActivity(Activity* activity) {
std::vector<Activity*>::iterator find = std::vector<Activity*>::iterator find =
std::find(activities_.begin(), activities_.end(), activity); std::find(activities_.begin(), activities_.end(), activity);
FOR_EACH_OBSERVER(ActivityManagerObserver, DCHECK(find != activities_.end());
observers_,
OnActivityEnding(activity));
if (find != activities_.end()) { if (find != activities_.end()) {
FOR_EACH_OBSERVER(
ActivityManagerObserver, observers_, OnActivityEnding(activity));
activities_.erase(find); activities_.erase(find);
ActivityViewManager* manager = ActivityViewManager::Get(); views::Widget* widget = GetWidget(activity);
manager->RemoveActivity(activity); widget->RemoveObserver(this);
widget->Close();
} }
} }
void ActivityManagerImpl::UpdateActivity(Activity* activity) { void ActivityManagerImpl::UpdateActivity(Activity* activity) {
ActivityViewManager* manager = ActivityViewManager::Get(); views::Widget* widget = GetWidget(activity);
manager->UpdateActivity(activity); widget->UpdateWindowIcon();
widget->UpdateWindowTitle();
} }
void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) { void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) {
...@@ -70,10 +93,28 @@ void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { ...@@ -70,10 +93,28 @@ void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) {
observers_.RemoveObserver(observer); observers_.RemoveObserver(observer);
} }
void ActivityManagerImpl::OnWidgetDestroying(views::Widget* widget) {
struct Matcher {
Matcher(aura::Window* w) : window(w) {}
bool operator()(Activity* activity) {
return activity->GetWindow() == window;
}
aura::Window* window;
};
std::vector<Activity*>::iterator iter =
std::find_if(activities_.begin(),
activities_.end(),
Matcher(widget->GetNativeWindow()));
DCHECK(iter != activities_.end());
if (iter != activities_.end()) {
widget->RemoveObserver(this);
Activity::Delete(*iter);
}
}
// static // static
ActivityManager* ActivityManager::Create() { ActivityManager* ActivityManager::Create() {
ActivityViewManager::Create();
new ActivityManagerImpl(); new ActivityManagerImpl();
CHECK(instance); CHECK(instance);
return instance; return instance;
...@@ -86,7 +127,6 @@ ActivityManager* ActivityManager::Get() { ...@@ -86,7 +127,6 @@ ActivityManager* ActivityManager::Get() {
void ActivityManager::Shutdown() { void ActivityManager::Shutdown() {
CHECK(instance); CHECK(instance);
delete instance; delete instance;
ActivityViewManager::Shutdown();
} }
......
...@@ -8,12 +8,14 @@ ...@@ -8,12 +8,14 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "ui/views/widget/widget_observer.h"
namespace athena { namespace athena {
class ActivityManagerObserver; class ActivityManagerObserver;
class ActivityManagerImpl : public ActivityManager { class ActivityManagerImpl : public ActivityManager,
public views::WidgetObserver {
public: public:
ActivityManagerImpl(); ActivityManagerImpl();
virtual ~ActivityManagerImpl(); virtual ~ActivityManagerImpl();
...@@ -27,6 +29,9 @@ class ActivityManagerImpl : public ActivityManager { ...@@ -27,6 +29,9 @@ class ActivityManagerImpl : public ActivityManager {
virtual void AddObserver(ActivityManagerObserver* observer) OVERRIDE; virtual void AddObserver(ActivityManagerObserver* observer) OVERRIDE;
virtual void RemoveObserver(ActivityManagerObserver* observer) OVERRIDE; virtual void RemoveObserver(ActivityManagerObserver* observer) OVERRIDE;
// views::WidgetObserver
virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
private: private:
std::vector<Activity*> activities_; std::vector<Activity*> activities_;
......
...@@ -20,6 +20,11 @@ TEST_F(ActivityManagerTest, Basic) { ...@@ -20,6 +20,11 @@ TEST_F(ActivityManagerTest, Basic) {
NULL, base::string16(), GURL()); NULL, base::string16(), GURL());
EXPECT_EQ(1, activity_manager->num_activities()); EXPECT_EQ(1, activity_manager->num_activities());
// Activity is not visible when created.
EXPECT_FALSE(activity1->GetWindow()->TargetVisibility());
Activity::Show(activity1);
EXPECT_TRUE(activity1->GetWindow()->TargetVisibility());
Activity* activity2 = athena::ActivityFactory::Get()->CreateWebActivity( Activity* activity2 = athena::ActivityFactory::Get()->CreateWebActivity(
NULL, base::string16(), GURL()); NULL, base::string16(), GURL());
EXPECT_EQ(2, activity_manager->num_activities()); EXPECT_EQ(2, activity_manager->num_activities());
......
// 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/activity/public/activity_view_manager.h"
#include <algorithm>
#include <map>
#include "athena/activity/activity_widget_delegate.h"
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_manager.h"
#include "athena/activity/public/activity_view_model.h"
#include "athena/screen/public/screen_manager.h"
#include "ui/aura/window.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace athena {
namespace {
typedef std::map<Activity*, views::Widget*> ActivityWidgetMap;
views::Widget* CreateWidget(Activity* activity) {
ActivityViewModel* view_model = activity->GetActivityViewModel();
views::Widget* widget = view_model->CreateWidget();
if (widget)
return widget;
widget = new views::Widget;
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
params.delegate = new ActivityWidgetDelegate(view_model);
widget->Init(params);
return widget;
}
ActivityViewManager* instance = NULL;
class ActivityViewManagerImpl : public ActivityViewManager,
public views::WidgetObserver {
public:
ActivityViewManagerImpl() {
CHECK(!instance);
instance = this;
}
virtual ~ActivityViewManagerImpl() {
CHECK_EQ(this, instance);
instance = NULL;
}
// ActivityViewManager:
virtual void AddActivity(Activity* activity) OVERRIDE {
CHECK(activity_widgets_.end() == activity_widgets_.find(activity));
views::Widget* container = CreateWidget(activity);
container->AddObserver(this);
activity_widgets_[activity] = container;
container->Show();
container->Activate();
// Call the Activity model's initializer. It might re-order the activity
// against others, which has to be done before before registering it to the
// system.
activity->GetActivityViewModel()->Init();
}
virtual void RemoveActivity(Activity* activity) OVERRIDE {
ActivityWidgetMap::iterator find = activity_widgets_.find(activity);
if (find != activity_widgets_.end()) {
views::Widget* widget = find->second;
widget->RemoveObserver(this);
widget->Close();
activity_widgets_.erase(activity);
}
}
virtual void UpdateActivity(Activity* activity) OVERRIDE {
ActivityWidgetMap::iterator find = activity_widgets_.find(activity);
if (find != activity_widgets_.end()) {
find->second->UpdateWindowIcon();
find->second->UpdateWindowTitle();
}
}
// views::WidgetObserver:
virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE {
for (ActivityWidgetMap::iterator iter = activity_widgets_.begin();
iter != activity_widgets_.end();
++iter) {
if (iter->second == widget) {
Activity::Delete(iter->first);
break;
}
}
}
private:
ActivityWidgetMap activity_widgets_;
DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl);
};
} // namespace
// static
ActivityViewManager* ActivityViewManager::Create() {
new ActivityViewManagerImpl();
CHECK(instance);
return instance;
}
ActivityViewManager* ActivityViewManager::Get() {
return instance;
}
void ActivityViewManager::Shutdown() {
CHECK(instance);
delete instance;
}
} // namespace athena
...@@ -62,7 +62,10 @@ class ATHENA_EXPORT Activity { ...@@ -62,7 +62,10 @@ class ATHENA_EXPORT Activity {
ACTIVITY_MEDIA_STATE_AUDIO_PLAYING // Audible audio is playing in activity. ACTIVITY_MEDIA_STATE_AUDIO_PLAYING // Audible audio is playing in activity.
}; };
// Delete an activity. // Shows and activates an activity.
static void Show(Activity* activity);
// Deletes an activity.
static void Delete(Activity* activity); static void Delete(Activity* activity);
// The Activity retains ownership of the returned view-model. // The Activity retains ownership of the returned view-model.
...@@ -82,6 +85,8 @@ class ATHENA_EXPORT Activity { ...@@ -82,6 +85,8 @@ class ATHENA_EXPORT Activity {
// Returns the window for the activity. This can be used to determine the // Returns the window for the activity. This can be used to determine the
// stacking order of this activity against others. // stacking order of this activity against others.
// TODO(oshima): Consider returning base::Window window instead,
// which has Show/ShowInactive and other control methods.
virtual aura::Window* GetWindow() = 0; virtual aura::Window* GetWindow() = 0;
protected: protected:
......
// 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_MANAGER_H_
#define ATHENA_ACTIVITY_PUBLIC_ACTIVITY_VIEW_MANAGER_H_
#include "athena/athena_export.h"
namespace athena {
class Activity;
// Manages the views for the activities.
class ATHENA_EXPORT ActivityViewManager {
public:
static ActivityViewManager* Create();
static ActivityViewManager* Get();
static void Shutdown();
virtual ~ActivityViewManager() {}
// Adds/Removes a task.
virtual void AddActivity(Activity* task) = 0;
virtual void RemoveActivity(Activity* task) = 0;
// Updates the UI when the task color/title changes.
virtual void UpdateActivity(Activity* task) = 0;
};
} // namespace athena
#endif // ATHENA_ACTIVITY_PUBLIC_ACTIVITY_VIEW_MANAGER_H_
...@@ -39,7 +39,6 @@ ...@@ -39,7 +39,6 @@
'activity/activity_factory.cc', 'activity/activity_factory.cc',
'activity/activity_manager_impl.cc', 'activity/activity_manager_impl.cc',
'activity/activity_manager_impl.h', 'activity/activity_manager_impl.h',
'activity/activity_view_manager_impl.cc',
'activity/activity_frame_view.cc', 'activity/activity_frame_view.cc',
'activity/activity_frame_view.h', 'activity/activity_frame_view.h',
'activity/activity_widget_delegate.cc', 'activity/activity_widget_delegate.cc',
...@@ -48,7 +47,6 @@ ...@@ -48,7 +47,6 @@
'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_manager.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',
......
...@@ -235,9 +235,9 @@ class AthenaWebView : public views::WebView { ...@@ -235,9 +235,9 @@ class AthenaWebView : public views::WebView {
case NEW_BACKGROUND_TAB: case NEW_BACKGROUND_TAB:
case NEW_POPUP: case NEW_POPUP:
case NEW_WINDOW: { case NEW_WINDOW: {
ActivityManager::Get()->AddActivity( Activity* activity = ActivityFactory::Get()->CreateWebActivity(
ActivityFactory::Get()->CreateWebActivity( browser_context(), base::string16(), params.url);
browser_context(), base::string16(), params.url)); Activity::Show(activity);
break; break;
} }
default: default:
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "athena/extensions/athena_app_delegate_base.h" #include "athena/extensions/athena_app_delegate_base.h"
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_factory.h" #include "athena/activity/public/activity_factory.h"
#include "athena/env/public/athena_env.h" #include "athena/env/public/athena_env.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
...@@ -22,7 +23,7 @@ content::WebContents* OpenURLInActivity(content::BrowserContext* context, ...@@ -22,7 +23,7 @@ content::WebContents* OpenURLInActivity(content::BrowserContext* context,
// Force all links to open in a new activity. // Force all links to open in a new activity.
Activity* activity = ActivityFactory::Get()->CreateWebActivity( Activity* activity = ActivityFactory::Get()->CreateWebActivity(
context, base::string16(), params.url); context, base::string16(), params.url);
DCHECK(activity); Activity::Show(activity);
// TODO(oshima): Get the web cotnents from activity. // TODO(oshima): Get the web cotnents from activity.
return NULL; return NULL;
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "athena/main/placeholder.h" #include "athena/main/placeholder.h"
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_factory.h" #include "athena/activity/public/activity_factory.h"
#include "athena/resources/grit/athena_resources.h" #include "athena/resources/grit/athena_resources.h"
#include "athena/system/public/system_ui.h" #include "athena/system/public/system_ui.h"
...@@ -15,9 +16,11 @@ void CreateTestPages(content::BrowserContext* browser_context) { ...@@ -15,9 +16,11 @@ void CreateTestPages(content::BrowserContext* browser_context) {
"http://cyan.bikeshed.com", "https://news.google.com", "http://cyan.bikeshed.com", "https://news.google.com",
"http://blue.bikeshed.com", "https://www.google.com", "http://blue.bikeshed.com", "https://www.google.com",
}; };
athena::ActivityFactory* factory = athena::ActivityFactory::Get();
for (size_t i = 0; i < arraysize(kTestURLs); ++i) { for (size_t i = 0; i < arraysize(kTestURLs); ++i) {
athena::ActivityFactory::Get()->CreateWebActivity( athena::Activity* activity = factory->CreateWebActivity(
browser_context, base::string16(), GURL(kTestURLs[i])); browser_context, base::string16(), GURL(kTestURLs[i]));
athena::Activity::Show(activity);
} }
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "athena/main/url_search_provider.h" #include "athena/main/url_search_provider.h"
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_factory.h" #include "athena/activity/public/activity_factory.h"
#include "athena/content/public/scheme_classifier_factory.h" #include "athena/content/public/scheme_classifier_factory.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
...@@ -171,8 +172,9 @@ class UrlSearchResult : public app_list::SearchResult { ...@@ -171,8 +172,9 @@ class UrlSearchResult : public app_list::SearchResult {
private: private:
// Overriddenn from app_list::SearchResult: // Overriddenn from app_list::SearchResult:
virtual void Open(int event_flags) OVERRIDE { virtual void Open(int event_flags) OVERRIDE {
ActivityFactory::Get()->CreateWebActivity( Activity* activity = ActivityFactory::Get()->CreateWebActivity(
browser_context_, base::string16(), match_.destination_url); browser_context_, base::string16(), match_.destination_url);
Activity::Show(activity);
} }
void UpdateIcon() { void UpdateIcon() {
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "ui/aura/window.h" #include "ui/aura/window.h"
namespace athena { namespace athena {
namespace {
class ResourceManagerImpl : public ResourceManager, class ResourceManagerImpl : public ResourceManager,
public WindowManagerObserver, public WindowManagerObserver,
...@@ -459,6 +460,8 @@ bool ResourceManagerImpl::AllowedToUnloadActivity() { ...@@ -459,6 +460,8 @@ bool ResourceManagerImpl::AllowedToUnloadActivity() {
base::Time::Now() >= next_resource_management_time_; base::Time::Now() >= next_resource_management_time_;
} }
} // namespace
// static // static
void ResourceManager::Create() { void ResourceManager::Create() {
DCHECK(!instance); DCHECK(!instance);
......
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