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 3 // found in the LICENSE file. 4 5 #include "athena/activity/activity_manager_impl.h" 6 7 #include <algorithm> 8 9 #include "athena/activity/activity_widget_delegate.h" 10 #include "athena/activity/public/activity.h" 11 #include "athena/activity/public/activity_manager_observer.h" 12 #include "athena/activity/public/activity_view_model.h" 13 #include "base/logging.h" 14 #include "base/observer_list.h" 15 #include "ui/views/widget/widget.h" 16 17 namespace athena { 18 19 namespace { 20 21 ActivityManager* instance = NULL; 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 42 } // namespace 43 44 ActivityManagerImpl::ActivityManagerImpl() { 45 CHECK(!instance); 46 instance = this; 47 } 48 49 ActivityManagerImpl::~ActivityManagerImpl() { 50 while (!activities_.empty()) 51 Activity::Delete(activities_.front()); 52 53 CHECK_EQ(this, instance); 54 instance = NULL; 55 } 56 57 void ActivityManagerImpl::AddActivity(Activity* activity) { 58 CHECK(activities_.end() == 59 std::find(activities_.begin(), activities_.end(), activity)); 60 activities_.push_back(activity); 61 views::Widget* widget = CreateWidget(activity); 62 widget->AddObserver(this); 63 FOR_EACH_OBSERVER(ActivityManagerObserver, 64 observers_, 65 OnActivityStarted(activity)); 66 } 67 68 void ActivityManagerImpl::RemoveActivity(Activity* activity) { 69 std::vector<Activity*>::iterator find = 70 std::find(activities_.begin(), activities_.end(), activity); 71 DCHECK(find != activities_.end()); 72 if (find != activities_.end()) { 73 FOR_EACH_OBSERVER( 74 ActivityManagerObserver, observers_, OnActivityEnding(activity)); 75 activities_.erase(find); 76 views::Widget* widget = GetWidget(activity); 77 widget->RemoveObserver(this); 78 widget->Close(); 79 } 80 } 81 82 void ActivityManagerImpl::UpdateActivity(Activity* activity) { 83 views::Widget* widget = GetWidget(activity); 84 widget->UpdateWindowIcon(); 85 widget->UpdateWindowTitle(); 86 } 87 88 Activity* ActivityManagerImpl::GetActivityForWindow(aura::Window* window) { 89 struct Matcher { 90 Matcher(aura::Window* w) : window(w) {} 91 bool operator()(Activity* activity) { 92 return activity->GetWindow() == window; 93 } 94 aura::Window* window; 95 }; 96 std::vector<Activity*>::iterator iter = 97 std::find_if(activities_.begin(), activities_.end(), Matcher(window)); 98 return iter != activities_.end() ? *iter : NULL; 99 } 100 101 void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) { 102 observers_.AddObserver(observer); 103 } 104 105 void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { 106 observers_.RemoveObserver(observer); 107 } 108 109 void ActivityManagerImpl::OnWidgetDestroying(views::Widget* widget) { 110 Activity* activity = GetActivityForWindow(widget->GetNativeWindow()); 111 if (activity) { 112 widget->RemoveObserver(this); 113 Activity::Delete(activity); 114 } 115 } 116 117 // static 118 ActivityManager* ActivityManager::Create() { 119 new ActivityManagerImpl(); 120 CHECK(instance); 121 return instance; 122 } 123 124 ActivityManager* ActivityManager::Get() { 125 return instance; 126 } 127 128 void ActivityManager::Shutdown() { 129 CHECK(instance); 130 delete instance; 131 } 132 133 134 } // namespace athena 135