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/activity_widget_delegate.h" |
10 #include "athena/activity/public/activity.h" | 10 #include "athena/activity/public/activity.h" |
11 #include "athena/activity/public/activity_manager_observer.h" | 11 #include "athena/activity/public/activity_manager_observer.h" |
12 #include "athena/activity/public/activity_view_model.h" | 12 #include "athena/activity/public/activity_view_model.h" |
13 #include "athena/screen/public/screen_manager.h" | |
13 #include "base/logging.h" | 14 #include "base/logging.h" |
14 #include "base/observer_list.h" | 15 #include "base/observer_list.h" |
16 #include "ui/aura/window.h" | |
15 #include "ui/views/widget/widget.h" | 17 #include "ui/views/widget/widget.h" |
18 #include "ui/wm/public/activation_client.h" | |
16 | 19 |
17 namespace athena { | 20 namespace athena { |
18 | 21 |
19 namespace { | 22 namespace { |
20 | 23 |
21 ActivityManager* instance = nullptr; | 24 ActivityManager* instance = nullptr; |
22 | 25 |
23 views::Widget* CreateWidget(Activity* activity) { | 26 views::Widget* CreateWidget(Activity* activity) { |
24 ActivityViewModel* view_model = activity->GetActivityViewModel(); | 27 ActivityViewModel* view_model = activity->GetActivityViewModel(); |
25 views::Widget* widget = view_model->CreateWidget(); | 28 views::Widget* widget = view_model->CreateWidget(); |
(...skipping 11 matching lines...) Expand all Loading... | |
37 CHECK(activity); | 40 CHECK(activity); |
38 CHECK(activity->GetWindow()); | 41 CHECK(activity->GetWindow()); |
39 return views::Widget::GetWidgetForNativeWindow(activity->GetWindow()); | 42 return views::Widget::GetWidgetForNativeWindow(activity->GetWindow()); |
40 } | 43 } |
41 | 44 |
42 } // namespace | 45 } // namespace |
43 | 46 |
44 ActivityManagerImpl::ActivityManagerImpl() { | 47 ActivityManagerImpl::ActivityManagerImpl() { |
45 CHECK(!instance); | 48 CHECK(!instance); |
46 instance = this; | 49 instance = this; |
50 | |
51 aura::Window* root_window = | |
52 ScreenManager::Get()->GetContext()->GetRootWindow(); | |
53 aura::client::GetActivationClient(root_window)->AddObserver(this); | |
47 } | 54 } |
48 | 55 |
49 ActivityManagerImpl::~ActivityManagerImpl() { | 56 ActivityManagerImpl::~ActivityManagerImpl() { |
57 aura::Window* root_window = | |
58 ScreenManager::Get()->GetContext()->GetRootWindow(); | |
59 aura::client::GetActivationClient(root_window)->RemoveObserver(this); | |
50 while (!activities_.empty()) | 60 while (!activities_.empty()) |
51 Activity::Delete(activities_.front()); | 61 Activity::Delete(activities_.front()); |
52 | 62 |
53 CHECK_EQ(this, instance); | 63 CHECK_EQ(this, instance); |
54 instance = nullptr; | 64 instance = nullptr; |
55 } | 65 } |
56 | 66 |
57 void ActivityManagerImpl::AddActivity(Activity* activity) { | 67 void ActivityManagerImpl::AddActivity(Activity* activity) { |
58 CHECK(activities_.end() == | 68 CHECK(activities_.end() == |
59 std::find(activities_.begin(), activities_.end(), activity)); | 69 std::find(activities_.begin(), activities_.end(), activity)); |
60 activities_.push_back(activity); | 70 activities_.insert(activities_.begin(), activity); |
61 views::Widget* widget = CreateWidget(activity); | 71 views::Widget* widget = CreateWidget(activity); |
62 widget->AddObserver(this); | 72 widget->GetNativeView()->AddObserver(this); |
63 FOR_EACH_OBSERVER(ActivityManagerObserver, | 73 FOR_EACH_OBSERVER(ActivityManagerObserver, |
64 observers_, | 74 observers_, |
65 OnActivityStarted(activity)); | 75 OnActivityStarted(activity)); |
66 } | 76 } |
67 | 77 |
68 void ActivityManagerImpl::RemoveActivity(Activity* activity) { | 78 void ActivityManagerImpl::RemoveActivity(Activity* activity) { |
69 std::vector<Activity*>::iterator find = | 79 std::vector<Activity*>::iterator find = |
70 std::find(activities_.begin(), activities_.end(), activity); | 80 std::find(activities_.begin(), activities_.end(), activity); |
71 DCHECK(find != activities_.end()); | 81 DCHECK(find != activities_.end()); |
72 if (find != activities_.end()) { | 82 if (find != activities_.end()) { |
73 FOR_EACH_OBSERVER( | 83 FOR_EACH_OBSERVER( |
74 ActivityManagerObserver, observers_, OnActivityEnding(activity)); | 84 ActivityManagerObserver, observers_, OnActivityEnding(activity)); |
75 activities_.erase(find); | 85 activities_.erase(find); |
76 views::Widget* widget = GetWidget(activity); | 86 views::Widget* widget = GetWidget(activity); |
77 widget->RemoveObserver(this); | 87 widget->GetNativeView()->RemoveObserver(this); |
78 widget->Close(); | 88 widget->Close(); |
79 } | 89 } |
80 } | 90 } |
81 | 91 |
82 void ActivityManagerImpl::UpdateActivity(Activity* activity) { | 92 void ActivityManagerImpl::UpdateActivity(Activity* activity) { |
83 views::Widget* widget = GetWidget(activity); | 93 views::Widget* widget = GetWidget(activity); |
84 widget->UpdateWindowIcon(); | 94 widget->UpdateWindowIcon(); |
85 widget->UpdateWindowTitle(); | 95 widget->UpdateWindowTitle(); |
86 } | 96 } |
87 | 97 |
98 const ActivityList& ActivityManagerImpl::GetActivities() { | |
99 return activities_; | |
100 } | |
101 | |
88 Activity* ActivityManagerImpl::GetActivityForWindow(aura::Window* window) { | 102 Activity* ActivityManagerImpl::GetActivityForWindow(aura::Window* window) { |
89 struct Matcher { | 103 struct Matcher { |
90 Matcher(aura::Window* w) : window(w) {} | 104 Matcher(aura::Window* w) : window(w) {} |
91 bool operator()(Activity* activity) { | 105 bool operator()(Activity* activity) { |
92 return activity->GetWindow() == window; | 106 return activity->GetWindow() == window; |
93 } | 107 } |
94 aura::Window* window; | 108 aura::Window* window; |
95 }; | 109 }; |
96 std::vector<Activity*>::iterator iter = | 110 std::vector<Activity*>::iterator iter = |
97 std::find_if(activities_.begin(), activities_.end(), Matcher(window)); | 111 std::find_if(activities_.begin(), activities_.end(), Matcher(window)); |
98 return iter != activities_.end() ? *iter : nullptr; | 112 return iter != activities_.end() ? *iter : nullptr; |
99 } | 113 } |
100 | 114 |
101 void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) { | 115 void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) { |
102 observers_.AddObserver(observer); | 116 observers_.AddObserver(observer); |
103 } | 117 } |
104 | 118 |
105 void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { | 119 void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { |
106 observers_.RemoveObserver(observer); | 120 observers_.RemoveObserver(observer); |
107 } | 121 } |
108 | 122 |
109 void ActivityManagerImpl::OnWidgetDestroying(views::Widget* widget) { | 123 void ActivityManagerImpl::OnWindowDestroying(aura::Window* window) { |
110 Activity* activity = GetActivityForWindow(widget->GetNativeWindow()); | 124 Activity* activity = GetActivityForWindow(window); |
111 if (activity) { | 125 if (activity) { |
112 widget->RemoveObserver(this); | 126 window->RemoveObserver(this); |
113 Activity::Delete(activity); | 127 Activity::Delete(activity); |
114 } | 128 } |
115 } | 129 } |
116 | 130 |
131 void ActivityManagerImpl::OnWindowActivated(aura::Window* gained_active, | |
132 aura::Window* lost_active) { | |
oshima
2014/11/04 00:26:03
can you add test for this?
sadrul
2014/11/04 03:43:46
Done.
| |
133 Activity* activity = GetActivityForWindow(gained_active); | |
134 if (!activity) | |
135 return; | |
136 CHECK(!activities_.empty()); | |
137 if (activity == activities_.front()) | |
138 return; | |
139 // Move the activity for |gained_active| at the front of the list. | |
140 ActivityList::reverse_iterator iter = std::find(activities_.rbegin(), | |
141 activities_.rend(), | |
142 activity); | |
143 CHECK(iter != activities_.rend()); | |
144 std::rotate(iter, iter + 1, activities_.rend()); | |
145 FOR_EACH_OBSERVER(ActivityManagerObserver, | |
146 observers_, | |
147 OnActivityOrderChanged()); | |
148 } | |
149 | |
117 // static | 150 // static |
118 ActivityManager* ActivityManager::Create() { | 151 ActivityManager* ActivityManager::Create() { |
119 new ActivityManagerImpl(); | 152 new ActivityManagerImpl(); |
120 CHECK(instance); | 153 CHECK(instance); |
121 return instance; | 154 return instance; |
122 } | 155 } |
123 | 156 |
124 ActivityManager* ActivityManager::Get() { | 157 ActivityManager* ActivityManager::Get() { |
125 return instance; | 158 return instance; |
126 } | 159 } |
127 | 160 |
128 void ActivityManager::Shutdown() { | 161 void ActivityManager::Shutdown() { |
129 CHECK(instance); | 162 CHECK(instance); |
130 delete instance; | 163 delete instance; |
131 } | 164 } |
132 | 165 |
133 | 166 |
134 } // namespace athena | 167 } // namespace athena |
OLD | NEW |