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