| 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 |