Home | History | Annotate | Download | only in activity
      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