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)#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_PREFERENCES_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_PREFERENCES_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector>
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/callback_forward.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/observer_list.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/removable_storage_observer.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionaryValue;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Extension;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionPrefs;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint64 MediaGalleryPrefId;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const MediaGalleryPrefId kInvalidMediaGalleryPrefId = 0;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kMediaGalleriesPrefsVersionKey[] = "preferencesVersion";
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kMediaGalleriesDefaultGalleryTypeKey[] = "defaultGalleryType";
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct MediaGalleryPermission {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId pref_id;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_permission;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct MediaGalleryPrefInfo {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Type {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kUserAdded,     // Explicitly added by the user.
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kAutoDetected,  // Auto added to the list of galleries.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kBlackListed,   // Auto added but then removed by the user.
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kScanResult,    // Discovered by a disk scan.
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kRemovedScan,   // Discovered by a disk scan but then removed by the user.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kInvalidType,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  enum DefaultGalleryType {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    kNotDefault,    // Normal gallery
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    kMusicDefault,
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    kPicturesDefault,
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    kVideosDefault,
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefInfo();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~MediaGalleryPrefInfo();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The absolute path of the gallery.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath AbsolutePath() const;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // True if the gallery should not be displayed to the user
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // i.e. kBlackListed || kRemovedScan.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsBlackListedType() const;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The ID that identifies this gallery in this Profile.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId pref_id;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The user-visible name of this gallery.
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 display_name;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A string which uniquely and persistently identifies the device that the
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // gallery lives on.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string device_id;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The root of the gallery, relative to the root of the device.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The type of gallery.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Type type;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The volume label of the volume/device on which the gallery
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resides. Empty if there is no such label or it is unknown.
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 volume_label;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Vendor name for the volume/device on which the gallery is located.
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Will be empty if unknown.
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 vendor_name;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Model name for the volume/device on which the gallery is located.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Will be empty if unknown.
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 model_name;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The capacity in bytes of the volume/device on which the gallery is
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // located. Will be zero if unknown.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint64 total_size_in_bytes;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the gallery is on a removable device, the time that device was last
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // attached. It is stored in preferences by the base::Time internal value,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // which is microseconds since the epoch.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time last_attach_time;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set to true if the volume metadata fields (volume_label, vendor_name,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // model_name, total_size_in_bytes) were set. False if these fields were
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // never written.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool volume_metadata_valid;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The following fields are populated with the audio, image, and video file
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // counts from the last scan. For files where it is hard to determine the
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // exact type, the file should be counted in all possible counts.
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int audio_count;
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int image_count;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int video_count;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Which default gallery this corresponds to (or not default at all).
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DefaultGalleryType default_gallery_type;
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 0 if the display_name is set externally and always used for display.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 1 if the display_name is only set externally when it is overriding
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the name constructed from volume metadata.
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // 2 if the display_name is set in a consistent manner that has resolved
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the issues in earlier versions.
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // 3 if the default_gallery_type is set (new field for this version).
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int prefs_version;
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Called by views to provide details for the gallery permission entries.
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 GetGalleryDisplayName() const;
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 GetGalleryTooltip() const;
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 GetGalleryAdditionalDetails() const;
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns true if the gallery is currently a removable device gallery which
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // is now attached, or a fixed storage gallery.
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsGalleryAvailable() const;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<MediaGalleryPrefId, MediaGalleryPrefInfo>
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MediaGalleriesPrefInfoMap;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::set<MediaGalleryPrefId> MediaGalleryPrefIdSet;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A class to manage the media gallery preferences.  There is one instance per
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// user profile. This class lives on the UI thread.
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MediaGalleriesPreferences
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public KeyedService,
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      public storage_monitor::RemovableStorageObserver {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class GalleryChangeObserver {
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   public:
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // |extension_id| specifies the extension affected by this change.
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // |pref_id| refers to the gallery.
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void OnPermissionAdded(MediaGalleriesPreferences* pref,
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   const std::string& extension_id,
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   MediaGalleryPrefId pref_id) {}
163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref,
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     const std::string& extension_id,
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     MediaGalleryPrefId pref_id) {}
167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void OnGalleryAdded(MediaGalleriesPreferences* pref,
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                MediaGalleryPrefId pref_id) {}
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref,
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  MediaGalleryPrefId pref_id) {}
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void OnGalleryInfoUpdated(MediaGalleriesPreferences* pref,
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      MediaGalleryPrefId pref_id) {}
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   protected:
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~GalleryChangeObserver();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit MediaGalleriesPreferences(Profile* profile);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MediaGalleriesPreferences();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Ensures that the preferences is initialized. The provided callback, if
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // non-null, will be called when initialization is complete. If initialization
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // has already completed, this callback will be invoked in the calling stack.
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Before the callback is run, other calls may not return the correct results.
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Should be invoked on the UI thread; callbacks will be run on the UI thread.
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This call also ensures that the StorageMonitor is initialized.
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Note for unit tests: This requires an active FILE thread and
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // EnsureMediaDirectoriesExists instance to complete reliably.
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void EnsureInitialized(base::Closure callback);
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Return true if the storage monitor has already been initialized.
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool IsInitialized() const;
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Profile* profile();
198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddGalleryChangeObserver(GalleryChangeObserver* observer);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveGalleryChangeObserver(GalleryChangeObserver* observer);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RemovableStorageObserver implementation.
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnRemovableStorageAttached(
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const storage_monitor::StorageInfo& info) OVERRIDE;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lookup a media gallery and fill in information about it and return true if
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it exists. Return false if it does not, filling in default information.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool LookUpGalleryByPath(const base::FilePath& path,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           MediaGalleryPrefInfo* gallery) const;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefIdSet LookUpGalleriesByDeviceId(
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& device_id) const;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the absolute file path of the gallery specified by the
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |gallery_id|. Returns an empty file path if the |gallery_id| is invalid.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set |include_unpermitted_galleries| to true to get the file path of the
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // gallery to which this |extension| has no access permission.
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(tommycli): Remove this function after Media Galleries API Private
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // is transitioned over to public. Also, the body of the function wrong.
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // It just returns the absolute path to the device, not the gallery.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath LookUpGalleryPathForExtension(
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MediaGalleryPrefId gallery_id,
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const extensions::Extension* extension,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool include_unpermitted_galleries);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Teaches the registry about a new gallery. If the gallery is in a
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // blacklisted state, it is unblacklisted. |type| should not be a blacklisted
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // type. Returns the gallery's pref id.
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId AddGallery(const std::string& device_id,
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const base::FilePath& relative_path,
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                MediaGalleryPrefInfo::Type type,
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                const base::string16& volume_label,
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                const base::string16& vendor_name,
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                const base::string16& model_name,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                uint64 total_size_in_bytes,
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                base::Time last_attach_time,
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                int audio_count,
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                int image_count,
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                int video_count);
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Teach the registry about a gallery simply from the path. If the gallery is
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in a blacklisted state, it is unblacklisted. |type| should not be a
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // blacklisted type. Returns the gallery's pref id.
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId AddGalleryByPath(const base::FilePath& path,
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      MediaGalleryPrefInfo::Type type);
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Logically removes the gallery identified by |id| from the store. For
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // auto added or scan result galleries, this means moving them into a
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // blacklisted state, otherwise they may come back when they are detected
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // again.
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ForgetGalleryById(MediaGalleryPrefId id);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove the gallery identified by |id| from the store entirely. If it is an
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // auto added or scan result gallery, it could get added again when the
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // location is noticed again.
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void EraseGalleryById(MediaGalleryPrefId id);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns true if some extension has permission for |id|, which may not be
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // an auto detected type.
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool NonAutoGalleryHasPermission(MediaGalleryPrefId id) const;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefIdSet GalleriesForExtension(
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension& extension);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns true if the permission changed. Returns false if there was
26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // no change.
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool SetGalleryPermissionForExtension(const extensions::Extension& extension,
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        MediaGalleryPrefId pref_id,
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        bool has_permission);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const MediaGalleriesPrefInfoMap& known_galleries() const;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // These keep track of when we last successfully completed a media scan.
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This is used to provide cached results when appropriate.
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Time GetLastScanCompletionTime() const;
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetLastScanCompletionTime(const base::Time& time);
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // KeyedService implementation:
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Shutdown() OVERRIDE;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the media gallery preferences system has ever been used
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for this profile. To be exact, it checks if a gallery has ever been added
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (including defaults).
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool APIHasBeenUsed(Profile* profile);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class MediaGalleriesPreferencesTest;
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class MediaGalleriesPermissionsTest;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<std::string /*device id*/, MediaGalleryPrefIdSet>
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DeviceIdPrefIdsMap;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // These must be called on the UI thread.
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void OnInitializationCallbackReturned();
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void FinishInitialization();
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Populates the default galleries. Call only on fresh profiles.
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void AddDefaultGalleries();
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // This is a hack - Some devices (iTunes, Picasa) are singletons in that only
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // one instance of that type is supported at a time. As such, the device id
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // should just be "itunes:" or "picasa:" but that would mean finding the
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // location of the database file multiple times, which may be an async
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // operation. Storing the location of the backing database in the device
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // id allows that look up to be avoided. However, the cost is that if the
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // database moves, the device id in preferences has to be updated.  This
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // method searches for a gallery of the type passed in and updates its
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // device id.  It returns true if the device id is up to date.
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool UpdateDeviceIDForSingletonType(const std::string& device_id);
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnStorageMonitorInit(bool api_has_been_used);
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Handle an iPhoto, iTunes, or Picasa finder returning a device ID to us.
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void OnFinderDeviceID(const std::string& device_id);
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Builds |known_galleries_| from the persistent store.
320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void InitFromPrefs();
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Adds a new gallery with the given parameters, or updates in-place an
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // existing gallery with the given device_id if one exists.
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(orenb): Simplify this and reduce the number of parameters.
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MediaGalleryPrefId AddOrUpdateGalleryInternal(
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& device_id,
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::string16& display_name,
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::FilePath& relative_path,
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MediaGalleryPrefInfo::Type type,
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::string16& volume_label,
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::string16& vendor_name,
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::string16& model_name,
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      uint64 total_size_in_bytes,
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Time last_attach_time,
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      bool volume_metadata_valid,
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int audio_count,
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int image_count,
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int video_count,
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int prefs_version,
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MediaGalleryPrefInfo::DefaultGalleryType default_gallery_type);
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void EraseOrBlacklistGalleryById(MediaGalleryPrefId id, bool erase);
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Updates the default galleries: finds the previously default galleries
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // and updates their device IDs (i.e., their paths) inplace if they have
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // changed.
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void UpdateDefaultGalleriesPaths();
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Sets permission for the media galleries identified by |gallery_id| for the
350d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // extension in the given |prefs|. Returns true only if anything changed.
351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool SetGalleryPermissionInPrefs(const std::string& extension_id,
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   MediaGalleryPrefId gallery_id,
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   bool has_access);
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Removes the entry for the media galleries permissions identified by
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |gallery_id| for the extension in the given |prefs|.
357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns true only if anything changed.
358d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool UnsetGalleryPermissionInPrefs(const std::string& extension_id,
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     MediaGalleryPrefId gallery_id);
360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Return all media gallery permissions for the extension in the given
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |prefs|.
363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<MediaGalleryPermission> GetGalleryPermissionsFromPrefs(
364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const std::string& extension_id) const;
365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Remove all the media gallery permissions in |prefs| for the gallery
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // specified by |gallery_id|.
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void RemoveGalleryPermissionsFromPrefs(MediaGalleryPrefId gallery_id);
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Get the ExtensionPrefs to use; this will be either the ExtensionPrefs
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // object associated with |profile_|, or extension_prefs_for_testing_, if
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // SetExtensionPrefsForTesting() has been called.
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionPrefs* GetExtensionPrefs() const;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the ExtensionPrefs object to be returned by GetExtensionPrefs().
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetExtensionPrefsForTesting(extensions::ExtensionPrefs* extension_prefs);
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool initialized_;
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<base::Closure> on_initialize_callbacks_;
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int pre_initialization_callbacks_waiting_;
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The profile that owns |this|.
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The ExtensionPrefs used in a testing environment, where KeyedServices
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // aren't used. This will be NULL unless it is set with
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // SetExtensionPrefsForTesting().
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  extensions::ExtensionPrefs* extension_prefs_for_testing_;
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // An in-memory cache of known galleries.
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleriesPrefInfoMap known_galleries_;
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A mapping from device id to the set of gallery pref ids on that device.
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All pref ids in |device_map_| are also in |known_galleries_|.
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DeviceIdPrefIdsMap device_map_;
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ObserverList<GalleryChangeObserver> gallery_change_observers_;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WeakPtrFactory<MediaGalleriesPreferences> weak_factory_;
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPreferences);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_PREFERENCES_H_
405