12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/media_galleries_private_api.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/gallery_watch_manager.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.h"
178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/extension_function.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::DictionaryValue;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::ListValue;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace AddGalleryWatch =
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::api::media_galleries_private::AddGalleryWatch;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RemoveGalleryWatch =
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::api::media_galleries_private::RemoveGalleryWatch;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace GetAllGalleryWatch =
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::api::media_galleries_private::GetAllGalleryWatch;
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace media_galleries_private =
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    api::media_galleries_private;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kInvalidGalleryIDError[] = "Invalid gallery ID";
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Handles the profile shutdown event on the file thread to clean up
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GalleryWatchManager.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HandleProfileShutdownOnFileThread(void* profile_id) {
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GalleryWatchManager::OnProfileShutdown(profile_id);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns true and sets |gallery_file_path| and |gallery_pref_id| if the
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// |gallery_id| is valid and returns false otherwise.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetGalleryFilePathAndId(const std::string& gallery_id,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Profile* profile,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const Extension* extension,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::FilePath* gallery_file_path,
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                             MediaGalleryPrefId* gallery_pref_id) {
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MediaGalleryPrefId pref_id;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!base::StringToUint64(gallery_id, &pref_id))
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(profile);
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::FilePath file_path(
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      preferences->LookUpGalleryPathForExtension(pref_id, extension, false));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (file_path.empty())
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *gallery_pref_id = pref_id;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *gallery_file_path = file_path;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                      MediaGalleriesPrivateAPI                             //
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MediaGalleriesPrivateAPI::MediaGalleriesPrivateAPI(
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::BrowserContext* context)
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : profile_(Profile::FromBrowserContext(context)), weak_ptr_factory_(this) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(profile_);
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter* event_router = EventRouter::Get(profile_);
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      this, media_galleries_private::OnGalleryChanged::kEventName);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPrivateAPI::~MediaGalleriesPrivateAPI() {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPrivateAPI::Shutdown() {
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter::Get(profile_)->UnregisterObserver(this);
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  weak_ptr_factory_.InvalidateWeakPtrs();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::BrowserThread::PostTask(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::FILE, FROM_HERE,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&HandleProfileShutdownOnFileThread, profile_));
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    BrowserContextKeyedAPIFactory<MediaGalleriesPrivateAPI> > g_factory =
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BrowserContextKeyedAPIFactory<MediaGalleriesPrivateAPI>*
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MediaGalleriesPrivateAPI::GetFactoryInstance() {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_factory.Pointer();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MediaGalleriesPrivateAPI* MediaGalleriesPrivateAPI::Get(
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::BrowserContext* context) {
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return BrowserContextKeyedAPIFactory<MediaGalleriesPrivateAPI>::Get(context);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPrivateAPI::OnListenerAdded(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const EventListenerInfo& details) {
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure MediaGalleriesPreferences is initialized. After that,
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // try to initialize the event router for the listener.
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This method is called synchronously with the message handler for the
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // JS invocation.
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(profile_);
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preferences->EnsureInitialized(base::Bind(
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &MediaGalleriesPrivateAPI::MaybeInitializeEventRouterAndTracker,
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      weak_ptr_factory_.GetWeakPtr()));
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPrivateEventRouter* MediaGalleriesPrivateAPI::GetEventRouter() {
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MaybeInitializeEventRouterAndTracker();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return media_galleries_private_event_router_.get();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GalleryWatchStateTracker*
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPrivateAPI::GetGalleryWatchStateTracker() {
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MaybeInitializeEventRouterAndTracker();
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return tracker_.get();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void MediaGalleriesPrivateAPI::MaybeInitializeEventRouterAndTracker() {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (media_galleries_private_event_router_.get())
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_galleries_private_event_router_.reset(
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new MediaGalleriesPrivateEventRouter(profile_));
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(g_browser_process->media_file_system_registry()->
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             GetPreferences(profile_)->IsInitialized());
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  tracker_.reset(
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new GalleryWatchStateTracker(profile_));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//              MediaGalleriesPrivateAddGalleryWatchFunction                 //
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPrivateAddGalleryWatchFunction::
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)~MediaGalleriesPrivateAddGalleryWatchFunction() {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool MediaGalleriesPrivateAddGalleryWatchFunction::RunAsync() {
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(GetProfile());
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_host() || !render_view_host()->GetProcess())
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AddGalleryWatch::Params> params(
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddGalleryWatch::Params::Create(*args_));
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetProfile());
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preferences->EnsureInitialized(base::Bind(
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &MediaGalleriesPrivateAddGalleryWatchFunction::OnPreferencesInit,
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      this,
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      params->gallery_id));
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void MediaGalleriesPrivateAddGalleryWatchFunction::OnPreferencesInit(
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& pref_id) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath gallery_file_path;
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MediaGalleryPrefId gallery_pref_id = 0;
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!GetGalleryFilePathAndId(pref_id,
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               GetProfile(),
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               extension(),
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               &gallery_file_path,
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               &gallery_pref_id)) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_ = kInvalidGalleryIDError;
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    HandleResponse(gallery_pref_id, false);
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleriesPrivateEventRouter* router =
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      MediaGalleriesPrivateAPI::Get(GetProfile())->GetEventRouter();
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(tommycli): The new GalleryWatchManager no longer checks that there is
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // an event listener attached. There should be a check for that here.
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(router);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::BrowserThread::PostTaskAndReplyWithResult(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::FILE,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&GalleryWatchManager::SetupGalleryWatch,
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 GetProfile(),
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gallery_pref_id,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gallery_file_path,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 extension_id(),
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 router->AsWeakPtr()),
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&MediaGalleriesPrivateAddGalleryWatchFunction::HandleResponse,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 this,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gallery_pref_id));
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPrivateAddGalleryWatchFunction::HandleResponse(
216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    MediaGalleryPrefId gallery_id,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool success) {
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  media_galleries_private::AddGalleryWatchResult result;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.gallery_id = base::Uint64ToString(gallery_id);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.success = success;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(result.ToValue().release());
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (success) {
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(g_browser_process->media_file_system_registry()
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)               ->GetPreferences(GetProfile())
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)               ->IsInitialized());
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GalleryWatchStateTracker* state_tracker = MediaGalleriesPrivateAPI::Get(
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        GetProfile())->GetGalleryWatchStateTracker();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_tracker->OnGalleryWatchAdded(extension_id(), gallery_id);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//              MediaGalleriesPrivateRemoveGalleryWatchFunction              //
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPrivateRemoveGalleryWatchFunction::
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)~MediaGalleriesPrivateRemoveGalleryWatchFunction() {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool MediaGalleriesPrivateRemoveGalleryWatchFunction::RunAsync() {
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_host() || !render_view_host()->GetProcess())
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RemoveGalleryWatch::Params> params(
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RemoveGalleryWatch::Params::Create(*args_));
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetProfile());
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preferences->EnsureInitialized(base::Bind(
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &MediaGalleriesPrivateRemoveGalleryWatchFunction::OnPreferencesInit,
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      this,
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      params->gallery_id));
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void MediaGalleriesPrivateRemoveGalleryWatchFunction::OnPreferencesInit(
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& pref_id) {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath gallery_file_path;
265d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MediaGalleryPrefId gallery_pref_id = 0;
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!GetGalleryFilePathAndId(pref_id,
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               GetProfile(),
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               extension(),
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               &gallery_file_path,
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               &gallery_pref_id)) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_ = kInvalidGalleryIDError;
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SendResponse(false);
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::BrowserThread::PostTask(
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      content::BrowserThread::FILE,
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      FROM_HERE,
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&GalleryWatchManager::RemoveGalleryWatch,
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 GetProfile(),
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gallery_file_path,
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 extension_id()));
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GalleryWatchStateTracker* state_tracker = MediaGalleriesPrivateAPI::Get(
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GetProfile())->GetGalleryWatchStateTracker();
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_tracker->OnGalleryWatchRemoved(extension_id(), gallery_pref_id);
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(true);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//              MediaGalleriesPrivateGetAllGalleryWatchFunction              //
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPrivateGetAllGalleryWatchFunction::
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)~MediaGalleriesPrivateGetAllGalleryWatchFunction() {
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool MediaGalleriesPrivateGetAllGalleryWatchFunction::RunAsync() {
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_host() || !render_view_host()->GetProcess())
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetProfile());
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preferences->EnsureInitialized(base::Bind(
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &MediaGalleriesPrivateGetAllGalleryWatchFunction::OnPreferencesInit,
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      this));
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void MediaGalleriesPrivateGetAllGalleryWatchFunction::OnPreferencesInit() {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> result;
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GalleryWatchStateTracker* state_tracker = MediaGalleriesPrivateAPI::Get(
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GetProfile())->GetGalleryWatchStateTracker();
316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MediaGalleryPrefIdSet gallery_ids =
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_tracker->GetAllWatchedGalleryIDsForExtension(extension_id());
318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (MediaGalleryPrefIdSet::const_iterator iter = gallery_ids.begin();
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != gallery_ids.end(); ++iter) {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result.push_back(base::Uint64ToString(*iter));
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results_ = GetAllGalleryWatch::Results::Create(result);
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(true);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//              MediaGalleriesPrivateRemoveAllGalleryWatchFunction           //
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPrivateRemoveAllGalleryWatchFunction::
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)~MediaGalleriesPrivateRemoveAllGalleryWatchFunction() {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool MediaGalleriesPrivateRemoveAllGalleryWatchFunction::RunAsync() {
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_host() || !render_view_host()->GetProcess())
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
3401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(
3411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetProfile());
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preferences->EnsureInitialized(base::Bind(
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &MediaGalleriesPrivateRemoveAllGalleryWatchFunction::OnPreferencesInit,
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      this));
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void MediaGalleriesPrivateRemoveAllGalleryWatchFunction::OnPreferencesInit() {
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(
3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetProfile());
3521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GalleryWatchStateTracker* state_tracker = MediaGalleriesPrivateAPI::Get(
3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GetProfile())->GetGalleryWatchStateTracker();
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  state_tracker->RemoveAllGalleryWatchersForExtension(
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extension_id(), preferences);
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(true);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
360