// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "athena/activity/activity_manager_impl.h" #include <algorithm> #include "athena/activity/activity_widget_delegate.h" #include "athena/activity/public/activity.h" #include "athena/activity/public/activity_manager_observer.h" #include "athena/activity/public/activity_view_model.h" #include "base/logging.h" #include "base/observer_list.h" #include "ui/views/widget/widget.h" namespace athena { namespace { ActivityManager* instance = NULL; views::Widget* CreateWidget(Activity* activity) { ActivityViewModel* view_model = activity->GetActivityViewModel(); views::Widget* widget = view_model->CreateWidget(); if (widget) return widget; widget = new views::Widget; views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); params.delegate = new ActivityWidgetDelegate(view_model); widget->Init(params); activity->GetActivityViewModel()->Init(); return widget; } views::Widget* GetWidget(Activity* activity) { CHECK(activity); CHECK(activity->GetWindow()); return views::Widget::GetWidgetForNativeWindow(activity->GetWindow()); } } // namespace ActivityManagerImpl::ActivityManagerImpl() { CHECK(!instance); instance = this; } ActivityManagerImpl::~ActivityManagerImpl() { while (!activities_.empty()) Activity::Delete(activities_.front()); CHECK_EQ(this, instance); instance = NULL; } void ActivityManagerImpl::AddActivity(Activity* activity) { CHECK(activities_.end() == std::find(activities_.begin(), activities_.end(), activity)); activities_.push_back(activity); views::Widget* widget = CreateWidget(activity); widget->AddObserver(this); FOR_EACH_OBSERVER(ActivityManagerObserver, observers_, OnActivityStarted(activity)); } void ActivityManagerImpl::RemoveActivity(Activity* activity) { std::vector<Activity*>::iterator find = std::find(activities_.begin(), activities_.end(), activity); DCHECK(find != activities_.end()); if (find != activities_.end()) { FOR_EACH_OBSERVER( ActivityManagerObserver, observers_, OnActivityEnding(activity)); activities_.erase(find); views::Widget* widget = GetWidget(activity); widget->RemoveObserver(this); widget->Close(); } } void ActivityManagerImpl::UpdateActivity(Activity* activity) { views::Widget* widget = GetWidget(activity); widget->UpdateWindowIcon(); widget->UpdateWindowTitle(); } Activity* ActivityManagerImpl::GetActivityForWindow(aura::Window* window) { struct Matcher { Matcher(aura::Window* w) : window(w) {} bool operator()(Activity* activity) { return activity->GetWindow() == window; } aura::Window* window; }; std::vector<Activity*>::iterator iter = std::find_if(activities_.begin(), activities_.end(), Matcher(window)); return iter != activities_.end() ? *iter : NULL; } void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) { observers_.AddObserver(observer); } void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { observers_.RemoveObserver(observer); } void ActivityManagerImpl::OnWidgetDestroying(views::Widget* widget) { Activity* activity = GetActivityForWindow(widget->GetNativeWindow()); if (activity) { widget->RemoveObserver(this); Activity::Delete(activity); } } // static ActivityManager* ActivityManager::Create() { new ActivityManagerImpl(); CHECK(instance); return instance; } ActivityManager* ActivityManager::Get() { return instance; } void ActivityManager::Shutdown() { CHECK(instance); delete instance; } } // namespace athena