Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1255)

Side by Side Diff: athena/activity/activity_manager_impl.cc

Issue 694353004: athena: Expose the list of activities from the ActivityManager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698