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