Home | History | Annotate | Download | only in apps
      1 // Copyright 2013 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 #ifndef APPS_APP_LIFETIME_MONITOR_H_
      6 #define APPS_APP_LIFETIME_MONITOR_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "apps/app_window_registry.h"
     12 #include "base/observer_list.h"
     13 #include "components/keyed_service/core/keyed_service.h"
     14 #include "content/public/browser/notification_observer.h"
     15 #include "content/public/browser/notification_registrar.h"
     16 
     17 namespace extensions {
     18 class Extension;
     19 }
     20 
     21 class Profile;
     22 
     23 namespace apps {
     24 
     25 // Observes startup of apps and their windows and notifies observers of these
     26 // events.
     27 class AppLifetimeMonitor : public KeyedService,
     28                            public content::NotificationObserver,
     29                            public AppWindowRegistry::Observer {
     30  public:
     31   class Observer {
     32    public:
     33     // Called when the app starts running.
     34     virtual void OnAppStart(Profile* profile, const std::string& app_id) = 0;
     35     // Called when the app becomes active to the user, i.e. it opens a window.
     36     virtual void OnAppActivated(Profile* profile,
     37                                 const std::string& app_id) = 0;
     38     // Called when the app becomes inactive to the user.
     39     virtual void OnAppDeactivated(Profile* profile,
     40                                   const std::string& app_id) = 0;
     41     // Called when the app stops running.
     42     virtual void OnAppStop(Profile* profile, const std::string& app_id) = 0;
     43     // Called when chrome is about to terminate. This gives observers a chance
     44     // to do something before the apps shut down. This is a system-wide event
     45     // so there is no associated profile and app id.
     46     virtual void OnChromeTerminating() = 0;
     47 
     48    protected:
     49     virtual ~Observer() {}
     50   };
     51 
     52   explicit AppLifetimeMonitor(Profile* profile);
     53   virtual ~AppLifetimeMonitor();
     54 
     55   void AddObserver(Observer* observer);
     56   void RemoveObserver(Observer* observer);
     57 
     58  private:
     59   // content::NotificationObserver overrides:
     60   virtual void Observe(int type,
     61                        const content::NotificationSource& source,
     62                        const content::NotificationDetails& details) OVERRIDE;
     63 
     64   // AppWindowRegistry::Observer overrides:
     65   virtual void OnAppWindowRemoved(AppWindow* app_window) OVERRIDE;
     66   virtual void OnAppWindowHidden(apps::AppWindow* app_window) OVERRIDE;
     67   virtual void OnAppWindowShown(apps::AppWindow* app_window) OVERRIDE;
     68 
     69   // KeyedService overrides:
     70   virtual void Shutdown() OVERRIDE;
     71 
     72   bool HasVisibleAppWindows(apps::AppWindow* app_window) const;
     73 
     74   void NotifyAppStart(const std::string& app_id);
     75   void NotifyAppActivated(const std::string& app_id);
     76   void NotifyAppDeactivated(const std::string& app_id);
     77   void NotifyAppStop(const std::string& app_id);
     78   void NotifyChromeTerminating();
     79 
     80   content::NotificationRegistrar registrar_;
     81   Profile* profile_;
     82   ObserverList<Observer> observers_;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(AppLifetimeMonitor);
     85 };
     86 
     87 }  // namespace apps
     88 
     89 #endif  // APPS_APP_LIFETIME_MONITOR_H_
     90