signed_in_devices_manager.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 CHROME_BROWSER_EXTENSIONS_API_SIGNED_IN_DEVICES_SIGNED_IN_DEVICES_MANAGER_H__ 6#define CHROME_BROWSER_EXTENSIONS_API_SIGNED_IN_DEVICES_SIGNED_IN_DEVICES_MANAGER_H__ 7 8#include <string> 9 10#include "base/gtest_prod_util.h" 11#include "base/memory/scoped_vector.h" 12#include "base/scoped_observer.h" 13#include "components/sync_driver/device_info_tracker.h" 14#include "extensions/browser/browser_context_keyed_api_factory.h" 15#include "extensions/browser/event_router.h" 16#include "extensions/browser/extension_registry_observer.h" 17 18class Profile; 19 20namespace content { 21class BrowserContext; 22class NotificationDetails; 23class NotificationObserver; 24class NotificationRegistrar; 25} // namespace content 26 27namespace extensions { 28class BrowserContextKeyedAPI; 29class ExtensionRegistry; 30 31struct EventListenerInfo; 32 33// An object of this class is created for each extension that has registered 34// to be notified for device info change. The objects listen for notification 35// from sync on device info change. On receiving the notification the 36// new list of devices is constructed and passed back to the extension. 37// The extension id is part of this object as it is needed to fill in the 38// public ids for devices(public ids for a device, is not the same for 39// all extensions). 40class SignedInDevicesChangeObserver 41 : public sync_driver::DeviceInfoTracker::Observer { 42 public: 43 SignedInDevicesChangeObserver(const std::string& extension_id, 44 Profile* profile); 45 virtual ~SignedInDevicesChangeObserver(); 46 47 virtual void OnDeviceInfoChange() OVERRIDE; 48 49 const std::string& extension_id() { 50 return extension_id_; 51 } 52 53 private: 54 std::string extension_id_; 55 Profile* const profile_; 56 content::NotificationRegistrar registrar_; 57}; 58 59class SignedInDevicesManager : public BrowserContextKeyedAPI, 60 public ExtensionRegistryObserver, 61 public EventRouter::Observer { 62 public: 63 // Default constructor used for testing. 64 SignedInDevicesManager(); 65 explicit SignedInDevicesManager(content::BrowserContext* context); 66 virtual ~SignedInDevicesManager(); 67 68 // BrowserContextKeyedAPI implementation. 69 static BrowserContextKeyedAPIFactory<SignedInDevicesManager>* 70 GetFactoryInstance(); 71 72 // ExtensionRegistryObserver implementation. 73 virtual void OnExtensionUnloaded( 74 content::BrowserContext* browser_context, 75 const Extension* extension, 76 UnloadedExtensionInfo::Reason reason) OVERRIDE; 77 78 // EventRouter::Observer: 79 virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE; 80 virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE; 81 82 private: 83 friend class BrowserContextKeyedAPIFactory<SignedInDevicesManager>; 84 85 // BrowserContextKeyedAPI implementation. 86 static const char* service_name() { 87 return "SignedInDevicesManager"; 88 } 89 static const bool kServiceHasOwnInstanceInIncognito = true; 90 91 void RemoveChangeObserverForExtension(const std::string& extension_id); 92 93 Profile* const profile_; 94 ScopedVector<SignedInDevicesChangeObserver> change_observers_; 95 96 // Listen to extension unloaded notification. 97 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 98 extension_registry_observer_; 99 100 FRIEND_TEST_ALL_PREFIXES(SignedInDevicesManager, UpdateListener); 101 102 DISALLOW_COPY_AND_ASSIGN(SignedInDevicesManager); 103}; 104 105} // namespace extensions 106 107#endif // CHROME_BROWSER_EXTENSIONS_API_SIGNED_IN_DEVICES_SIGNED_IN_DEVICES_MANAGER_H__ 108