Skip to content

Commit

Permalink
Media Galleries API: Hook GalleryWatchManager up to MediaGalleriesEve…
Browse files Browse the repository at this point in the history
…ntRouter.

BUG=144491

Review URL: https://codereview.chromium.org/331353007

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@281132 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
tommycli@chromium.org committed Jul 3, 2014
1 parent ec4d62e commit 5a43fe6
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "chrome/browser/extensions/blob_reader.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/media_galleries/fileapi/safe_media_metadata_parser.h"
#include "chrome/browser/media_galleries/gallery_watch_manager.h"
#include "chrome/browser/media_galleries/media_file_system_registry.h"
#include "chrome/browser/media_galleries/media_galleries_histograms.h"
#include "chrome/browser/media_galleries/media_galleries_permission_controller.h"
Expand All @@ -45,7 +46,6 @@
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/blob_holder.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h"
Expand Down Expand Up @@ -97,6 +97,10 @@ MediaFileSystemRegistry* media_file_system_registry() {
return g_browser_process->media_file_system_registry();
}

GalleryWatchManager* gallery_watch_manager() {
return media_file_system_registry()->gallery_watch_manager();
}

MediaScanManager* media_scan_manager() {
return media_file_system_registry()->media_scan_manager();
}
Expand Down Expand Up @@ -279,6 +283,11 @@ MediaGalleriesEventRouter::MediaGalleriesEventRouter(
: profile_(Profile::FromBrowserContext(context)), weak_ptr_factory_(this) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(profile_);

EventRouter::Get(profile_)->RegisterObserver(
this, MediaGalleries::OnGalleryChanged::kEventName);

gallery_watch_manager()->AddObserver(profile_, this);
media_scan_manager()->AddObserver(profile_, this);
}

Expand All @@ -288,6 +297,10 @@ MediaGalleriesEventRouter::~MediaGalleriesEventRouter() {
void MediaGalleriesEventRouter::Shutdown() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
weak_ptr_factory_.InvalidateWeakPtrs();

EventRouter::Get(profile_)->UnregisterObserver(this);

gallery_watch_manager()->RemoveObserver(profile_);
media_scan_manager()->RemoveObserver(profile_);
media_scan_manager()->CancelScansForProfile(profile_);
}
Expand All @@ -311,6 +324,12 @@ MediaGalleriesEventRouter* MediaGalleriesEventRouter::Get(
return BrowserContextKeyedAPIFactory<MediaGalleriesEventRouter>::Get(context);
}

bool MediaGalleriesEventRouter::ExtensionHasGalleryChangeListener(
const std::string& extension_id) const {
return EventRouter::Get(profile_)->ExtensionHasEventListener(
extension_id, MediaGalleries::OnGalleryChanged::kEventName);
}

bool MediaGalleriesEventRouter::ExtensionHasScanProgressListener(
const std::string& extension_id) const {
return EventRouter::Get(profile_)->ExtensionHasEventListener(
Expand Down Expand Up @@ -376,6 +395,36 @@ void MediaGalleriesEventRouter::DispatchEventToExtension(
router->DispatchEventToExtension(extension_id, event.Pass());
}

void MediaGalleriesEventRouter::OnGalleryChanged(
const std::string& extension_id, MediaGalleryPrefId gallery_id) {
MediaGalleries::GalleryChangeDetails details;
details.type = MediaGalleries::GALLERY_CHANGE_TYPE_CONTENTS_CHANGED;
details.gallery_id = gallery_id;
DispatchEventToExtension(
extension_id,
MediaGalleries::OnGalleryChanged::kEventName,
MediaGalleries::OnGalleryChanged::Create(details).Pass());
}

void MediaGalleriesEventRouter::OnGalleryWatchDropped(
const std::string& extension_id, MediaGalleryPrefId gallery_id) {
MediaGalleries::GalleryChangeDetails details;
details.type = MediaGalleries::GALLERY_CHANGE_TYPE_WATCH_DROPPED;
details.gallery_id = gallery_id;
DispatchEventToExtension(
extension_id,
MediaGalleries::OnGalleryChanged::kEventName,
MediaGalleries::OnGalleryChanged::Create(details).Pass());
}

void MediaGalleriesEventRouter::OnListenerRemoved(
const EventListenerInfo& details) {
if (details.event_name == MediaGalleries::OnGalleryChanged::kEventName &&
!ExtensionHasGalleryChangeListener(details.extension_id)) {
gallery_watch_manager()->RemoveAllWatches(profile_, details.extension_id);
}
}

MediaGalleriesGetMediaFileSystemsFunction::
~MediaGalleriesGetMediaFileSystemsFunction() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/extensions/chrome_extension_function.h"
#include "chrome/browser/media_galleries/gallery_watch_manager_observer.h"
#include "chrome/browser/media_galleries/media_file_system_registry.h"
#include "chrome/browser/media_galleries/media_scan_manager_observer.h"
#include "chrome/common/extensions/api/media_galleries.h"
#include "chrome/common/media_galleries/metadata_types.h"
#include "components/storage_monitor/media_storage_util.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/event_router.h"

namespace MediaGalleries = extensions::api::media_galleries;

Expand All @@ -42,7 +44,9 @@ class Extension;
// The profile-keyed service that manages the media galleries extension API.
// Created at the same time as the Profile. This is also the event router.
class MediaGalleriesEventRouter : public BrowserContextKeyedAPI,
public MediaScanManagerObserver {
public GalleryWatchManagerObserver,
public MediaScanManagerObserver,
public extensions::EventRouter::Observer {
public:
// KeyedService implementation.
virtual void Shutdown() OVERRIDE;
Expand All @@ -54,6 +58,7 @@ class MediaGalleriesEventRouter : public BrowserContextKeyedAPI,
// Convenience method to get the MediaGalleriesAPI for a profile.
static MediaGalleriesEventRouter* Get(content::BrowserContext* context);

bool ExtensionHasGalleryChangeListener(const std::string& extension_id) const;
bool ExtensionHasScanProgressListener(const std::string& extension_id) const;

// MediaScanManagerObserver implementation.
Expand Down Expand Up @@ -81,6 +86,15 @@ class MediaGalleriesEventRouter : public BrowserContextKeyedAPI,
}
static const bool kServiceIsNULLWhileTesting = true;

// GalleryWatchManagerObserver
virtual void OnGalleryChanged(const std::string& extension_id,
MediaGalleryPrefId gallery_id) OVERRIDE;
virtual void OnGalleryWatchDropped(const std::string& extension_id,
MediaGalleryPrefId gallery_id) OVERRIDE;

// extensions::EventRouter::Observer implementation.
virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE;

// Current profile.
Profile* profile_;

Expand Down
7 changes: 7 additions & 0 deletions chrome/browser/media_galleries/media_file_system_registry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
#include "chrome/browser/media_galleries/fileapi/mtp_device_map_service.h"
#include "chrome/browser/media_galleries/gallery_watch_manager.h"
#include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
#include "chrome/browser/media_galleries/media_file_system_context.h"
#include "chrome/browser/media_galleries/media_galleries_dialog_controller.h"
Expand Down Expand Up @@ -576,6 +577,12 @@ MediaScanManager* MediaFileSystemRegistry::media_scan_manager() {
return media_scan_manager_.get();
}

GalleryWatchManager* MediaFileSystemRegistry::gallery_watch_manager() {
if (!gallery_watch_manager_)
gallery_watch_manager_.reset(new GalleryWatchManager);
return gallery_watch_manager_.get();
}

void MediaFileSystemRegistry::OnRemovableStorageDetached(
const StorageInfo& info) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
Expand Down
3 changes: 3 additions & 0 deletions chrome/browser/media_galleries/media_file_system_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "components/storage_monitor/removable_storage_observer.h"

class ExtensionGalleriesHost;
class GalleryWatchManager;
class MediaFileSystemContext;
class MediaGalleriesPreferences;
class MediaScanManager;
Expand Down Expand Up @@ -95,6 +96,7 @@ class MediaFileSystemRegistry
MediaGalleriesPreferences* GetPreferences(Profile* profile);

MediaScanManager* media_scan_manager();
GalleryWatchManager* gallery_watch_manager();

// RemovableStorageObserver implementation.
virtual void OnRemovableStorageDetached(
Expand Down Expand Up @@ -134,6 +136,7 @@ class MediaFileSystemRegistry
scoped_ptr<MediaFileSystemContext> file_system_context_;

scoped_ptr<MediaScanManager> media_scan_manager_;
scoped_ptr<GalleryWatchManager> gallery_watch_manager_;

DISALLOW_COPY_AND_ASSIGN(MediaFileSystemRegistry);
};
Expand Down
19 changes: 19 additions & 0 deletions chrome/common/extensions/api/media_galleries.idl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@
// images, video) from the user's local disks (with the user's consent).
namespace mediaGalleries {

[inline_doc] enum GalleryChangeType {
// The contents of the gallery have changed.
contents_changed,
// The watch has been dropped because the device has been detached,
// the gallery permission has been removed, or any other reason.
watch_dropped
};

[inline_doc] enum GetMediaFileSystemsInteractivity {
// Do not act interactively.
no,
Expand Down Expand Up @@ -36,6 +44,14 @@ namespace mediaGalleries {
// The scan encountered an error and could not proceed.
error
};

[inline_doc] dictionary GalleryChangeDetails {
// Type of change event.
GalleryChangeType type;

// Identifies the modified gallery.
DOMString galleryId;
};

[inline_doc] dictionary MediaFileSystemsDetails {
// Whether to prompt the user for permission to additional media galleries
Expand Down Expand Up @@ -207,6 +223,9 @@ namespace mediaGalleries {
};

interface Events {
// Fired when a media gallery is changed or a gallery watch is dropped.
static void onGalleryChanged(GalleryChangeDetails details);

// The pending media scan has changed state. See details for more
// information.
static void onScanProgress(ScanProgressDetails details);
Expand Down

0 comments on commit 5a43fe6

Please sign in to comment.