Chromium Code Reviews| Index: chrome/browser/media_galleries/media_galleries_preferences.cc |
| diff --git a/chrome/browser/media_galleries/media_galleries_preferences.cc b/chrome/browser/media_galleries/media_galleries_preferences.cc |
| index 61bd0747908a7ecc76b5cc56ad6d9116ab0f5055..67af2ae28a7394561897519e2b9081bc6b181762 100644 |
| --- a/chrome/browser/media_galleries/media_galleries_preferences.cc |
| +++ b/chrome/browser/media_galleries/media_galleries_preferences.cc |
| @@ -4,6 +4,7 @@ |
| #include "chrome/browser/media_galleries/media_galleries_preferences.h" |
| +#include "base/callback.h" |
| #include "base/i18n/time_formatting.h" |
| #include "base/path_service.h" |
| #include "base/prefs/pref_service.h" |
| @@ -30,6 +31,7 @@ |
| #include "chrome/common/extensions/permissions/permissions_data.h" |
| #include "chrome/common/pref_names.h" |
| #include "components/user_prefs/pref_registry_syncable.h" |
| +#include "content/public/browser/browser_thread.h" |
| #include "grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/text/bytes_formatting.h" |
| @@ -332,34 +334,98 @@ MediaGalleriesPreferences::GalleryChangeObserver::~GalleryChangeObserver() {} |
| MediaGalleriesPreferences::MediaGalleriesPreferences(Profile* profile) |
| : weak_factory_(this), |
| + initialized_(false), |
| + pre_initialization_callbacks_waiting_(0), |
| profile_(profile), |
| - extension_prefs_for_testing_(NULL) { |
| + extension_prefs_for_testing_(NULL) {} |
| + |
| +MediaGalleriesPreferences::~MediaGalleriesPreferences() { |
| + if (StorageMonitor::GetInstance()) |
| + StorageMonitor::GetInstance()->RemoveObserver(this); |
| +} |
| + |
| +void MediaGalleriesPreferences::EnsureInitialized(base::Closure callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + |
| + if (initialized_) { |
|
vandebo (ex-Chrome)
2013/09/23 18:35:13
nit: use IsInitialized()
tommycli
2013/09/23 20:39:12
Done.
|
| + if (!callback.is_null()) |
| + callback.Run(); |
| + return; |
| + } |
| + |
| + if (!on_initialize_callbacks_.empty()) |
| + return; |
| + |
| + on_initialize_callbacks_.push_back(callback); |
|
vandebo (ex-Chrome)
2013/09/23 18:35:13
Move above 356
tommycli
2013/09/23 20:39:12
Done.
|
| + |
| AddDefaultGalleriesIfFreshProfile(); |
| + pre_initialization_callbacks_waiting_ = 2; |
| + |
| + // Ensure StorageMonitor is initialized. |
| + StorageMonitor::GetInstance()->EnsureInitialized( |
| + base::Bind(&MediaGalleriesPreferences::OnInitializationCallbackReturned, |
| + weak_factory_.GetWeakPtr())); |
| + |
| // Look for optional default galleries every time. |
| itunes::ITunesFinder::FindITunesLibrary( |
| - base::Bind(&MediaGalleriesPreferences::OnITunesDeviceID, |
| + base::Bind(&MediaGalleriesPreferences::OnFinderDeviceID, |
| weak_factory_.GetWeakPtr())); |
| // TODO(tommycli): Turn on when Picasa code is ready. |
| #if 0 |
| picasa::PicasaFinder::FindPicasaDatabaseOnUIThread( |
| - base::Bind(&MediaGalleriesPreferences::OnPicasaDeviceID, |
| + base::Bind(&MediaGalleriesPreferences::OnFinderDeviceID, |
| weak_factory_.GetWeakPtr())); |
| #endif |
| +} |
| + |
| +bool MediaGalleriesPreferences::IsInitialized() const { return initialized_; } |
| + |
| +Profile* MediaGalleriesPreferences::profile() { return profile_; } |
| + |
| +void MediaGalleriesPreferences::OnInitializationCallbackReturned() { |
| + DCHECK(!IsInitialized()); |
| + DCHECK(pre_initialization_callbacks_waiting_ > 0); |
| + if (--pre_initialization_callbacks_waiting_ == 0) |
| + FinishInitialization(); |
| +} |
| + |
| +void MediaGalleriesPreferences::FinishInitialization() { |
| + DCHECK(!IsInitialized()); |
| + |
| + initialized_ = true; |
| + |
| + StorageMonitor* monitor = StorageMonitor::GetInstance(); |
| + DCHECK(monitor->IsInitialized()); |
| InitFromPrefs(); |
| StorageMonitor::GetInstance()->AddObserver(this); |
| -} |
| -MediaGalleriesPreferences::~MediaGalleriesPreferences() { |
| - if (StorageMonitor::GetInstance()) |
| - StorageMonitor::GetInstance()->RemoveObserver(this); |
| -} |
| + std::vector<StorageInfo> existing_devices = |
| + monitor->GetAllAvailableStorages(); |
| + for (size_t i = 0; i < existing_devices.size(); i++) { |
| + if (!(StorageInfo::IsMediaDevice(existing_devices[i].device_id()) && |
| + StorageInfo::IsRemovableDevice(existing_devices[i].device_id()))) |
| + continue; |
| + AddGallery(existing_devices[i].device_id(), |
| + base::FilePath(), |
| + false, |
| + existing_devices[i].storage_label(), |
| + existing_devices[i].vendor_name(), |
| + existing_devices[i].model_name(), |
| + existing_devices[i].total_size_in_bytes(), |
| + base::Time::Now()); |
| + } |
| -Profile* MediaGalleriesPreferences::profile() { |
| - return profile_; |
| + for (std::vector<base::Closure>::iterator iter = |
| + on_initialize_callbacks_.begin(); |
| + iter != on_initialize_callbacks_.end(); |
| + ++iter) { |
| + iter->Run(); |
| + } |
| + on_initialize_callbacks_.clear(); |
| } |
| void MediaGalleriesPreferences::AddDefaultGalleriesIfFreshProfile() { |
| @@ -430,25 +496,24 @@ bool MediaGalleriesPreferences::UpdateDeviceIDForSingletonType( |
| return false; |
| } |
| -void MediaGalleriesPreferences::OnITunesDeviceID(const std::string& device_id) { |
| - if (device_id.empty()) |
| - return; |
| - if (!UpdateDeviceIDForSingletonType(device_id)) { |
| - AddGalleryInternal(device_id, ASCIIToUTF16(kITunesGalleryName), |
| - base::FilePath(), false /*not user added*/, |
| - string16(), string16(), string16(), 0, |
| - base::Time(), false, 2); |
| - } |
| -} |
| +void MediaGalleriesPreferences::OnFinderDeviceID(const std::string& device_id) { |
| + if (!device_id.empty() && !UpdateDeviceIDForSingletonType(device_id)) { |
| + std::string gallery_name; |
| + if (StorageInfo::IsITunesDevice(device_id)) |
| + gallery_name = kITunesGalleryName; |
| + else if (StorageInfo::IsPicasaDevice(device_id)) |
| + gallery_name = kPicasaGalleryName; |
| + else |
| + NOTREACHED(); |
| -void MediaGalleriesPreferences::OnPicasaDeviceID(const std::string& device_id) { |
| - DCHECK(!device_id.empty()); |
| - if (!UpdateDeviceIDForSingletonType(device_id)) { |
| - AddGalleryInternal(device_id, ASCIIToUTF16(kPicasaGalleryName), |
| + AddGalleryInternal(device_id, ASCIIToUTF16(gallery_name), |
| base::FilePath(), false /*not user added*/, |
| string16(), string16(), string16(), 0, |
| base::Time(), false, 2); |
| } |
| + |
| + if (!IsInitialized()) |
|
vandebo (ex-Chrome)
2013/09/23 18:35:13
nit: remove if
tommycli
2013/09/23 20:39:12
Done.
|
| + OnInitializationCallbackReturned(); |
| } |
| void MediaGalleriesPreferences::InitFromPrefs() { |
| @@ -477,16 +542,19 @@ void MediaGalleriesPreferences::InitFromPrefs() { |
| void MediaGalleriesPreferences::AddGalleryChangeObserver( |
| GalleryChangeObserver* observer) { |
| + DCHECK(IsInitialized()); |
| gallery_change_observers_.AddObserver(observer); |
| } |
| void MediaGalleriesPreferences::RemoveGalleryChangeObserver( |
| GalleryChangeObserver* observer) { |
| + DCHECK(IsInitialized()); |
| gallery_change_observers_.RemoveObserver(observer); |
| } |
| void MediaGalleriesPreferences::OnRemovableStorageAttached( |
| const StorageInfo& info) { |
| + DCHECK(IsInitialized()); |
| if (!StorageInfo::IsMediaDevice(info.device_id())) |
| return; |
| @@ -502,6 +570,7 @@ void MediaGalleriesPreferences::OnRemovableStorageAttached( |
| bool MediaGalleriesPreferences::LookUpGalleryByPath( |
| const base::FilePath& path, |
| MediaGalleryPrefInfo* gallery_info) const { |
| + DCHECK(IsInitialized()); |
| StorageInfo info; |
| base::FilePath relative_path; |
| if (!MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path)) { |
| @@ -560,6 +629,7 @@ base::FilePath MediaGalleriesPreferences::LookUpGalleryPathForExtension( |
| MediaGalleryPrefId gallery_id, |
| const extensions::Extension* extension, |
| bool include_unpermitted_galleries) { |
| + DCHECK(IsInitialized()); |
| DCHECK(extension); |
| if (!include_unpermitted_galleries && |
| !ContainsKey(GalleriesForExtension(*extension), gallery_id)) |
| @@ -578,6 +648,7 @@ MediaGalleryPrefId MediaGalleriesPreferences::AddGallery( |
| const string16& volume_label, const string16& vendor_name, |
| const string16& model_name, uint64 total_size_in_bytes, |
| base::Time last_attach_time) { |
| + DCHECK(IsInitialized()); |
| return AddGalleryInternal(device_id, string16(), relative_path, user_added, |
| volume_label, vendor_name, model_name, |
| total_size_in_bytes, last_attach_time, true, 2); |
| @@ -710,6 +781,7 @@ MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryInternal( |
| MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryByPath( |
| const base::FilePath& path) { |
| + DCHECK(IsInitialized()); |
| MediaGalleryPrefInfo gallery_info; |
| if (LookUpGalleryByPath(path, &gallery_info) && |
| gallery_info.type != MediaGalleryPrefInfo::kBlackListed) { |
| @@ -729,6 +801,7 @@ MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryByPath( |
| } |
| void MediaGalleriesPreferences::ForgetGalleryById(MediaGalleryPrefId pref_id) { |
| + DCHECK(IsInitialized()); |
| PrefService* prefs = profile_->GetPrefs(); |
| scoped_ptr<ListPrefUpdate> update(new ListPrefUpdate( |
| prefs, prefs::kMediaGalleriesRememberedGalleries)); |
| @@ -764,6 +837,7 @@ void MediaGalleriesPreferences::ForgetGalleryById(MediaGalleryPrefId pref_id) { |
| MediaGalleryPrefIdSet MediaGalleriesPreferences::GalleriesForExtension( |
| const extensions::Extension& extension) const { |
| + DCHECK(IsInitialized()); |
| MediaGalleryPrefIdSet result; |
| if (HasAutoDetectedGalleryPermission(extension)) { |
| @@ -798,6 +872,7 @@ void MediaGalleriesPreferences::SetGalleryPermissionForExtension( |
| const extensions::Extension& extension, |
| MediaGalleryPrefId pref_id, |
| bool has_permission) { |
| + DCHECK(IsInitialized()); |
| // The gallery may not exist anymore if the user opened a second config |
| // surface concurrently and removed it. Drop the permission update if so. |
| MediaGalleriesPrefInfoMap::const_iterator gallery_info = |
| @@ -827,6 +902,12 @@ void MediaGalleriesPreferences::SetGalleryPermissionForExtension( |
| OnPermissionRemoved(this, extension.id(), pref_id)); |
| } |
| +const MediaGalleriesPrefInfoMap& MediaGalleriesPreferences::known_galleries() |
| + const { |
| + DCHECK(IsInitialized()); |
| + return known_galleries_; |
| +} |
| + |
| void MediaGalleriesPreferences::Shutdown() { |
| weak_factory_.InvalidateWeakPtrs(); |
| profile_ = NULL; |
| @@ -854,6 +935,7 @@ bool MediaGalleriesPreferences::SetGalleryPermissionInPrefs( |
| const std::string& extension_id, |
| MediaGalleryPrefId gallery_id, |
| bool has_access) { |
| + DCHECK(IsInitialized()); |
| ExtensionPrefs::ScopedListUpdate update(GetExtensionPrefs(), |
| extension_id, |
| kMediaGalleriesPermissions); |
| @@ -891,9 +973,9 @@ bool MediaGalleriesPreferences::SetGalleryPermissionInPrefs( |
| bool MediaGalleriesPreferences::UnsetGalleryPermissionInPrefs( |
| const std::string& extension_id, |
| MediaGalleryPrefId gallery_id) { |
| - ExtensionPrefs::ScopedListUpdate update(GetExtensionPrefs(), |
| - extension_id, |
| - kMediaGalleriesPermissions); |
| + DCHECK(IsInitialized()); |
| + ExtensionPrefs::ScopedListUpdate update( |
|
vandebo (ex-Chrome)
2013/09/23 18:35:13
nit: formatting
tommycli
2013/09/23 20:39:12
Done.
|
| + GetExtensionPrefs(), extension_id, kMediaGalleriesPermissions); |
| ListValue* permissions = update.Get(); |
| if (!permissions) |
| return false; |
| @@ -917,6 +999,7 @@ bool MediaGalleriesPreferences::UnsetGalleryPermissionInPrefs( |
| std::vector<MediaGalleryPermission> |
| MediaGalleriesPreferences::GetGalleryPermissionsFromPrefs( |
| const std::string& extension_id) const { |
| + DCHECK(IsInitialized()); |
| std::vector<MediaGalleryPermission> result; |
| const ListValue* permissions; |
| if (!GetExtensionPrefs()->ReadPrefAsList(extension_id, |
| @@ -941,6 +1024,7 @@ MediaGalleriesPreferences::GetGalleryPermissionsFromPrefs( |
| void MediaGalleriesPreferences::RemoveGalleryPermissionsFromPrefs( |
| MediaGalleryPrefId gallery_id) { |
| + DCHECK(IsInitialized()); |
| ExtensionPrefs* prefs = GetExtensionPrefs(); |
| const DictionaryValue* extensions = |
| prefs->pref_service()->GetDictionary(prefs::kExtensionsPref); |
| @@ -958,6 +1042,7 @@ void MediaGalleriesPreferences::RemoveGalleryPermissionsFromPrefs( |
| } |
| ExtensionPrefs* MediaGalleriesPreferences::GetExtensionPrefs() const { |
| + DCHECK(IsInitialized()); |
| if (extension_prefs_for_testing_) |
| return extension_prefs_for_testing_; |
| return extensions::ExtensionPrefs::Get(profile_); |
| @@ -965,5 +1050,6 @@ ExtensionPrefs* MediaGalleriesPreferences::GetExtensionPrefs() const { |
| void MediaGalleriesPreferences::SetExtensionPrefsForTesting( |
| extensions::ExtensionPrefs* extension_prefs) { |
| + DCHECK(IsInitialized()); |
| extension_prefs_for_testing_ = extension_prefs; |
| } |