OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "athena/activity/activity_manager_impl.h" | 5 #include "athena/activity/activity_manager_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
| 9 #include "athena/activity/activity_widget_delegate.h" |
9 #include "athena/activity/public/activity.h" | 10 #include "athena/activity/public/activity.h" |
10 #include "athena/activity/public/activity_manager_observer.h" | 11 #include "athena/activity/public/activity_manager_observer.h" |
11 #include "athena/activity/public/activity_view_manager.h" | 12 #include "athena/activity/public/activity_view_model.h" |
12 #include "base/logging.h" | 13 #include "base/logging.h" |
13 #include "base/observer_list.h" | 14 #include "base/observer_list.h" |
| 15 #include "ui/views/widget/widget.h" |
14 | 16 |
15 namespace athena { | 17 namespace athena { |
16 | 18 |
17 namespace { | 19 namespace { |
18 | 20 |
19 ActivityManager* instance = NULL; | 21 ActivityManager* instance = NULL; |
20 | 22 |
| 23 views::Widget* CreateWidget(Activity* activity) { |
| 24 ActivityViewModel* view_model = activity->GetActivityViewModel(); |
| 25 views::Widget* widget = view_model->CreateWidget(); |
| 26 if (widget) |
| 27 return widget; |
| 28 widget = new views::Widget; |
| 29 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); |
| 30 params.delegate = new ActivityWidgetDelegate(view_model); |
| 31 widget->Init(params); |
| 32 activity->GetActivityViewModel()->Init(); |
| 33 return widget; |
| 34 } |
| 35 |
| 36 views::Widget* GetWidget(Activity* activity) { |
| 37 CHECK(activity); |
| 38 CHECK(activity->GetWindow()); |
| 39 return views::Widget::GetWidgetForNativeWindow(activity->GetWindow()); |
| 40 } |
| 41 |
21 } // namespace | 42 } // namespace |
22 | 43 |
23 ActivityManagerImpl::ActivityManagerImpl() { | 44 ActivityManagerImpl::ActivityManagerImpl() { |
24 CHECK(!instance); | 45 CHECK(!instance); |
25 instance = this; | 46 instance = this; |
26 } | 47 } |
27 | 48 |
28 ActivityManagerImpl::~ActivityManagerImpl() { | 49 ActivityManagerImpl::~ActivityManagerImpl() { |
29 while (!activities_.empty()) | 50 while (!activities_.empty()) |
30 Activity::Delete(activities_.front()); | 51 Activity::Delete(activities_.front()); |
31 | 52 |
32 CHECK_EQ(this, instance); | 53 CHECK_EQ(this, instance); |
33 instance = NULL; | 54 instance = NULL; |
34 } | 55 } |
35 | 56 |
36 void ActivityManagerImpl::AddActivity(Activity* activity) { | 57 void ActivityManagerImpl::AddActivity(Activity* activity) { |
37 CHECK(activities_.end() == | 58 CHECK(activities_.end() == |
38 std::find(activities_.begin(), activities_.end(), activity)); | 59 std::find(activities_.begin(), activities_.end(), activity)); |
39 activities_.push_back(activity); | 60 activities_.push_back(activity); |
40 ActivityViewManager* manager = ActivityViewManager::Get(); | 61 views::Widget* widget = CreateWidget(activity); |
41 manager->AddActivity(activity); | 62 widget->AddObserver(this); |
42 FOR_EACH_OBSERVER(ActivityManagerObserver, | 63 FOR_EACH_OBSERVER(ActivityManagerObserver, |
43 observers_, | 64 observers_, |
44 OnActivityStarted(activity)); | 65 OnActivityStarted(activity)); |
45 } | 66 } |
46 | 67 |
47 void ActivityManagerImpl::RemoveActivity(Activity* activity) { | 68 void ActivityManagerImpl::RemoveActivity(Activity* activity) { |
48 std::vector<Activity*>::iterator find = | 69 std::vector<Activity*>::iterator find = |
49 std::find(activities_.begin(), activities_.end(), activity); | 70 std::find(activities_.begin(), activities_.end(), activity); |
50 FOR_EACH_OBSERVER(ActivityManagerObserver, | 71 DCHECK(find != activities_.end()); |
51 observers_, | |
52 OnActivityEnding(activity)); | |
53 if (find != activities_.end()) { | 72 if (find != activities_.end()) { |
| 73 FOR_EACH_OBSERVER( |
| 74 ActivityManagerObserver, observers_, OnActivityEnding(activity)); |
54 activities_.erase(find); | 75 activities_.erase(find); |
55 ActivityViewManager* manager = ActivityViewManager::Get(); | 76 views::Widget* widget = GetWidget(activity); |
56 manager->RemoveActivity(activity); | 77 widget->RemoveObserver(this); |
| 78 widget->Close(); |
57 } | 79 } |
58 } | 80 } |
59 | 81 |
60 void ActivityManagerImpl::UpdateActivity(Activity* activity) { | 82 void ActivityManagerImpl::UpdateActivity(Activity* activity) { |
61 ActivityViewManager* manager = ActivityViewManager::Get(); | 83 views::Widget* widget = GetWidget(activity); |
62 manager->UpdateActivity(activity); | 84 widget->UpdateWindowIcon(); |
| 85 widget->UpdateWindowTitle(); |
63 } | 86 } |
64 | 87 |
65 void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) { | 88 void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) { |
66 observers_.AddObserver(observer); | 89 observers_.AddObserver(observer); |
67 } | 90 } |
68 | 91 |
69 void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { | 92 void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { |
70 observers_.RemoveObserver(observer); | 93 observers_.RemoveObserver(observer); |
71 } | 94 } |
72 | 95 |
| 96 void ActivityManagerImpl::OnWidgetDestroying(views::Widget* widget) { |
| 97 struct Matcher { |
| 98 Matcher(aura::Window* w) : window(w) {} |
| 99 |
| 100 bool operator()(Activity* activity) { |
| 101 return activity->GetWindow() == window; |
| 102 } |
| 103 aura::Window* window; |
| 104 }; |
| 105 std::vector<Activity*>::iterator iter = |
| 106 std::find_if(activities_.begin(), |
| 107 activities_.end(), |
| 108 Matcher(widget->GetNativeWindow())); |
| 109 DCHECK(iter != activities_.end()); |
| 110 if (iter != activities_.end()) { |
| 111 widget->RemoveObserver(this); |
| 112 Activity::Delete(*iter); |
| 113 } |
| 114 } |
| 115 |
73 // static | 116 // static |
74 ActivityManager* ActivityManager::Create() { | 117 ActivityManager* ActivityManager::Create() { |
75 ActivityViewManager::Create(); | |
76 | |
77 new ActivityManagerImpl(); | 118 new ActivityManagerImpl(); |
78 CHECK(instance); | 119 CHECK(instance); |
79 return instance; | 120 return instance; |
80 } | 121 } |
81 | 122 |
82 ActivityManager* ActivityManager::Get() { | 123 ActivityManager* ActivityManager::Get() { |
83 return instance; | 124 return instance; |
84 } | 125 } |
85 | 126 |
86 void ActivityManager::Shutdown() { | 127 void ActivityManager::Shutdown() { |
87 CHECK(instance); | 128 CHECK(instance); |
88 delete instance; | 129 delete instance; |
89 ActivityViewManager::Shutdown(); | |
90 } | 130 } |
91 | 131 |
92 | 132 |
93 } // namespace athena | 133 } // namespace athena |
OLD | NEW |