media_galleries_preferences.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/base_paths_posix.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/i18n/time_formatting.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/media_galleries_private_api.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/itunes_finder.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/picasa_finder.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/storage_monitor/media_storage_util.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/storage_monitor/storage_monitor.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/permissions/api_permission.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/permissions/media_galleries_permission.h" 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_data.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/generated_resources.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/l10n/l10n_util.h" 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/text/bytes_formatting.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using base::DictionaryValue; 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using base::ListValue; 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using extensions::ExtensionPrefs; 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Pref key for the list of media gallery permissions. 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kMediaGalleriesPermissions[] = "media_galleries_permissions"; 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Pref key for Media Gallery ID. 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kMediaGalleryIdKey[] = "id"; 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Pref key for Media Gallery Permission Value. 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kMediaGalleryHasPermissionKey[] = "has_permission"; 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesDeviceIdKey[] = "deviceId"; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesDisplayNameKey[] = "displayName"; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesPathKey[] = "path"; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesPrefIdKey[] = "prefId"; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeKey[] = "type"; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesVolumeLabelKey[] = "volumeLabel"; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesVendorNameKey[] = "vendorName"; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesModelNameKey[] = "modelName"; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesSizeKey[] = "totalSize"; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesLastAttachTimeKey[] = "lastAttachTime"; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesPrefsVersionKey[] = "preferencesVersion"; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeAutoDetectedValue[] = "autoDetected"; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeUserAddedValue[] = "userAdded"; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeBlackListedValue[] = "blackListed"; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kITunesGalleryName[] = "iTunes"; 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kPicasaGalleryName[] = "Picasa"; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetPrefId(const DictionaryValue& dict, MediaGalleryPrefId* value) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string string_id; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dict.GetString(kMediaGalleriesPrefIdKey, &string_id) || 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !base::StringToUint64(string_id, value)) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetType(const DictionaryValue& dict, MediaGalleryPrefInfo::Type* type) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string string_type; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dict.GetString(kMediaGalleriesTypeKey, &string_type)) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_type == kMediaGalleriesTypeAutoDetectedValue) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *type = MediaGalleryPrefInfo::kAutoDetected; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_type == kMediaGalleriesTypeUserAddedValue) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *type = MediaGalleryPrefInfo::kUserAdded; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_type == kMediaGalleriesTypeBlackListedValue) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *type = MediaGalleryPrefInfo::kBlackListed; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PopulateGalleryPrefInfoFromDictionary( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValue& dict, MediaGalleryPrefInfo* out_gallery_info) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId pref_id; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 display_name; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string device_id; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType path; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo::Type type = MediaGalleryPrefInfo::kAutoDetected; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 volume_label; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 vendor_name; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 model_name; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double total_size_in_bytes = 0.0; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double last_attach_time = 0.0; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool volume_metadata_valid = false; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int prefs_version = 0; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetPrefId(dict, &pref_id) || 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !dict.GetString(kMediaGalleriesDeviceIdKey, &device_id) || 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !dict.GetString(kMediaGalleriesPathKey, &path) || 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !GetType(dict, &type)) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetString(kMediaGalleriesDisplayNameKey, &display_name); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetInteger(kMediaGalleriesPrefsVersionKey, &prefs_version); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dict.GetString(kMediaGalleriesVolumeLabelKey, &volume_label) && 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetString(kMediaGalleriesVendorNameKey, &vendor_name) && 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetString(kMediaGalleriesModelNameKey, &model_name) && 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetDouble(kMediaGalleriesSizeKey, &total_size_in_bytes) && 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetDouble(kMediaGalleriesLastAttachTimeKey, &last_attach_time)) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volume_metadata_valid = true; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->pref_id = pref_id; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->display_name = display_name; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->device_id = device_id; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->path = base::FilePath(path); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->type = type; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->volume_label = volume_label; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->vendor_name = vendor_name; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->model_name = model_name; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->total_size_in_bytes = total_size_in_bytes; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->last_attach_time = 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::FromInternalValue(last_attach_time); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->volume_metadata_valid = volume_metadata_valid; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->prefs_version = prefs_version; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryValue* CreateGalleryPrefInfoDictionary( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaGalleryPrefInfo& gallery) { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* dict = new DictionaryValue(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesPrefIdKey, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Uint64ToString(gallery.pref_id)); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gallery.volume_metadata_valid) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesDisplayNameKey, gallery.display_name); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesDeviceIdKey, gallery.device_id); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesPathKey, gallery.path.value()); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* type = NULL; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (gallery.type) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MediaGalleryPrefInfo::kAutoDetected: 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type = kMediaGalleriesTypeAutoDetectedValue; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MediaGalleryPrefInfo::kUserAdded: 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type = kMediaGalleriesTypeUserAddedValue; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MediaGalleryPrefInfo::kBlackListed: 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type = kMediaGalleriesTypeBlackListedValue; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesTypeKey, type); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery.volume_metadata_valid) { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVolumeLabelKey, gallery.volume_label); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVendorNameKey, gallery.vendor_name); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesModelNameKey, gallery.model_name); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesSizeKey, gallery.total_size_in_bytes); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesLastAttachTimeKey, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery.last_attach_time.ToInternalValue()); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Version 0 of the prefs format was that the display_name was always 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // used to show the user-visible name of the gallery. Version 1 means 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that there is an optional display_name, and when it is present, it 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overrides the name that would be built from the volume metadata, path, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or whatever other data. So if we see a display_name with version 0, it 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // means it may be overwritten simply by getting new volume metadata. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A display_name with version 1 should not be overwritten. 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetInteger(kMediaGalleriesPrefsVersionKey, gallery.prefs_version); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dict; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HasAutoDetectedGalleryPermission(const extensions::Extension& extension) { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::MediaGalleriesPermission::CheckParam param( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::MediaGalleriesPermission::kAllAutoDetectedPermission); 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return extensions::PermissionsData::CheckAPIPermissionWithParam( 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &extension, extensions::APIPermission::kMediaGalleries, ¶m); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Retrieves the MediaGalleryPermission from the given dictionary; DCHECKs on 207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// failure. 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetMediaGalleryPermissionFromDictionary( 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DictionaryValue* dict, 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaGalleryPermission* out_permission) { 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string string_id; 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (dict->GetString(kMediaGalleryIdKey, &string_id) && 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::StringToUint64(string_id, &out_permission->pref_id) && 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict->GetBoolean(kMediaGalleryHasPermissionKey, 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &out_permission->has_permission)) { 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstring16 GetDisplayNameForDevice(uint64 storage_size_in_bytes, 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const string16& name) { 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!name.empty()); 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return (storage_size_in_bytes == 0) ? 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch name : ui::FormatBytes(storage_size_in_bytes) + ASCIIToUTF16(" ") + name; 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// For a device with |device_name| and a relative path |sub_folder|, construct 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a display name. If |sub_folder| is empty, then just return |device_name|. 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstring16 GetDisplayNameForSubFolder(const string16& device_name, 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& sub_folder) { 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (sub_folder.empty()) 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return device_name; 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return (sub_folder.BaseName().LossyDisplayName() + 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASCIIToUTF16(" - ") + 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch device_name); 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstring16 GetFullProductName(const string16& vendor_name, 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const string16& model_name) { 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (vendor_name.empty() && model_name.empty()) 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return string16(); 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch string16 product_name; 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (vendor_name.empty()) 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch product_name = model_name; 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (model_name.empty()) 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch product_name = vendor_name; 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (!vendor_name.empty() && !model_name.empty()) 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch product_name = vendor_name + UTF8ToUTF16(", ") + model_name; 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return product_name; 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefInfo::MediaGalleryPrefInfo() 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : pref_id(kInvalidMediaGalleryPrefId), 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(kInvalidType), 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_size_in_bytes(0), 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volume_metadata_valid(false), 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_version(0) { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefInfo::~MediaGalleryPrefInfo() {} 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath MediaGalleryPrefInfo::AbsolutePath() const { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath base_path = MediaStorageUtil::FindDevicePathById(device_id); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!path.IsAbsolute()); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base_path.empty() ? base_path : base_path.Append(path); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstring16 MediaGalleryPrefInfo::GetGalleryDisplayName() const { 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!StorageInfo::IsRemovableDevice(device_id)) { 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // For fixed storage, the default name is the fully qualified directory 27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // name, or in the case of a root directory, the root directory name. 27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Exception: ChromeOS -- the full pathname isn't visible there, so only 27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the directory name is used. 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath path = AbsolutePath(); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!display_name.empty()) 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return display_name; 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_CHROMEOS) 28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // See chrome/browser/chromeos/fileapi/file_system_backend.cc 28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath home_path; 28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (PathService::Get(base::DIR_HOME, &home_path)) { 28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) home_path = home_path.AppendASCII("Downloads"); 28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath relative; 29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (home_path.AppendRelativePath(path, &relative)) 29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return relative.LossyDisplayName(); 29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return path.BaseName().LossyDisplayName(); 29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return path.LossyDisplayName(); 29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch string16 name = display_name; 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (name.empty()) 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch name = volume_label; 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (name.empty()) 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch name = GetFullProductName(vendor_name, model_name); 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (name.empty()) 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch name = l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_UNLABELED_DEVICE); 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch name = GetDisplayNameForDevice(total_size_in_bytes, name); 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!path.empty()) 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch name = GetDisplayNameForSubFolder(name, path); 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return name; 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstring16 MediaGalleryPrefInfo::GetGalleryTooltip() const { 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return AbsolutePath().LossyDisplayName(); 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstring16 MediaGalleryPrefInfo::GetGalleryAdditionalDetails() const { 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch string16 attached; 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (StorageInfo::IsRemovableDevice(device_id)) { 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (MediaStorageUtil::IsRemovableStorageAttached(device_id)) { 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attached = l10n_util::GetStringUTF16( 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_MEDIA_GALLERIES_DIALOG_DEVICE_ATTACHED); 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (!last_attach_time.is_null()) { 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attached = l10n_util::GetStringFUTF16( 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_MEDIA_GALLERIES_LAST_ATTACHED, 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeFormatShortDateNumeric(last_attach_time)); 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attached = l10n_util::GetStringUTF16( 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_MEDIA_GALLERIES_DIALOG_DEVICE_NOT_ATTACHED); 332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return attached; 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool MediaGalleryPrefInfo::IsGalleryAvailable() const { 339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return !StorageInfo::IsRemovableDevice(device_id) || 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaStorageUtil::IsRemovableStorageAttached(device_id); 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPreferences::GalleryChangeObserver::~GalleryChangeObserver() {} 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPreferences::MediaGalleriesPreferences(Profile* profile) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_factory_(this), 347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_(profile), 348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension_prefs_for_testing_(NULL) { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddDefaultGalleriesIfFreshProfile(); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Look for optional default galleries every time. 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) itunes::ITunesFinder::FindITunesLibrary( 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MediaGalleriesPreferences::OnITunesDeviceID, 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_.GetWeakPtr())); 35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(tommycli): Turn on when Picasa code is ready. 35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if 0 35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) picasa::PicasaFinder::FindPicasaDatabaseOnUIThread( 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&MediaGalleriesPreferences::OnPicasaDeviceID, 36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) weak_factory_.GetWeakPtr())); 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitFromPrefs(); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StorageMonitor::GetInstance()->AddObserver(this); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MediaGalleriesPreferences::~MediaGalleriesPreferences() { 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (StorageMonitor::GetInstance()) 3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) StorageMonitor::GetInstance()->RemoveObserver(this); 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)Profile* MediaGalleriesPreferences::profile() { 374d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return profile_; 375d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::AddDefaultGalleriesIfFreshProfile() { 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only add defaults the first time. 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (APIHasBeenUsed(profile_)) 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fresh profile case. 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kDirectoryKeys[] = { 384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) chrome::DIR_USER_MUSIC, 385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) chrome::DIR_USER_PICTURES, 386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) chrome::DIR_USER_VIDEOS, 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(kDirectoryKeys); ++i) { 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PathService::Get(kDirectoryKeys[i], &path)) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath relative_path; 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StorageInfo info; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path)) { 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AddGalleryInternal(info.device_id(), info.name(), relative_path, false, 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.storage_label(), info.vendor_name(), 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.model_name(), info.total_size_in_bytes(), 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time(), true, 2); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool MediaGalleriesPreferences::UpdateDeviceIDForSingletonType( 4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& device_id) { 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) StorageInfo::Type singleton_type; 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!StorageInfo::CrackDeviceId(device_id, &singleton_type, NULL)) 4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<ListPrefUpdate> update(new ListPrefUpdate( 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) prefs, prefs::kMediaGalleriesRememberedGalleries)); 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ListValue* list = update->Get(); 4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (ListValue::iterator iter = list->begin(); iter != list->end(); ++iter) { 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // All of these calls should succeed, but preferences file can be corrupt. 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DictionaryValue* dict; 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!(*iter)->GetAsDictionary(&dict)) 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string this_device_id; 4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!dict->GetString(kMediaGalleriesDeviceIdKey, &this_device_id)) 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (this_device_id == device_id) 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; // No update is necessary. 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) StorageInfo::Type device_type; 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!StorageInfo::CrackDeviceId(this_device_id, &device_type, NULL)) 4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (device_type == singleton_type) { 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dict->SetString(kMediaGalleriesDeviceIdKey, device_id); 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) update.reset(); // commits the update. 432d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitFromPrefs(); 433d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId pref_id; 434d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (GetPrefId(*dict, &pref_id)) { 435d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(GalleryChangeObserver, 436d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gallery_change_observers_, 437d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnGalleryInfoUpdated(this, pref_id)); 438d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void MediaGalleriesPreferences::OnITunesDeviceID(const std::string& device_id) { 4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (device_id.empty()) 4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!UpdateDeviceIDForSingletonType(device_id)) { 4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AddGalleryInternal(device_id, ASCIIToUTF16(kITunesGalleryName), 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath(), false /*not user added*/, 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) string16(), string16(), string16(), 0, 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time(), false, 2); 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void MediaGalleriesPreferences::OnPicasaDeviceID(const std::string& device_id) { 45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!device_id.empty()); 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!UpdateDeviceIDForSingletonType(device_id)) { 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AddGalleryInternal(device_id, ASCIIToUTF16(kPicasaGalleryName), 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath(), false /*not user added*/, 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) string16(), string16(), string16(), 0, 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time(), false, 2); 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 46490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 466d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void MediaGalleriesPreferences::InitFromPrefs() { 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.clear(); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_map_.clear(); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ListValue* list = prefs->GetList( 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kMediaGalleriesRememberedGalleries); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (list) { 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ListValue::const_iterator it = list->begin(); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != list->end(); ++it) { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValue* dict = NULL; 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!(*it)->GetAsDictionary(&dict)) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo gallery_info; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PopulateGalleryPrefInfoFromDictionary(*dict, &gallery_info)) 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_[gallery_info.pref_id] = gallery_info; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_map_[gallery_info.device_id].insert(gallery_info.pref_id); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::AddGalleryChangeObserver( 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryChangeObserver* observer) { 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_change_observers_.AddObserver(observer); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::RemoveGalleryChangeObserver( 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryChangeObserver* observer) { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_change_observers_.RemoveObserver(observer); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::OnRemovableStorageAttached( 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StorageInfo& info) { 50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!StorageInfo::IsMediaDevice(info.device_id())) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AddGallery(info.device_id(), base::FilePath(), 5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false /*not user added*/, 5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.storage_label(), 5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.vendor_name(), 5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.model_name(), 5107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.total_size_in_bytes(), 5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time::Now()); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaGalleriesPreferences::LookUpGalleryByPath( 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo* gallery_info) const { 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StorageInfo info; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath relative_path; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path)) { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *gallery_info = MediaGalleryPrefInfo(); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) relative_path = relative_path.NormalizePathSeparators(); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefIdSet galleries_on_device = 52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LookUpGalleriesByDeviceId(info.device_id()); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (MediaGalleryPrefIdSet::const_iterator it = galleries_on_device.begin(); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != galleries_on_device.end(); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it) { 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaGalleryPrefInfo& gallery = known_galleries_.find(*it)->second; 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery.path != relative_path) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *gallery_info = gallery; 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This method is called by controller::FilesSelected when the user 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // adds a new gallery. Control reaches here when the selected gallery is 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on a volume we know about, but have no gallery already for. Returns 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hypothetical data to the caller about what the prefs will look like 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the gallery is added. 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(gbillock): split this out into another function so it doesn't 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // conflate LookUp. 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info) { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->pref_id = kInvalidMediaGalleryPrefId; 54990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gallery_info->device_id = info.device_id(); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->path = relative_path; 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->type = MediaGalleryPrefInfo::kUserAdded; 5527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gallery_info->volume_label = info.storage_label(); 5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gallery_info->vendor_name = info.vendor_name(); 5547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gallery_info->model_name = info.model_name(); 5557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gallery_info->total_size_in_bytes = info.total_size_in_bytes(); 5567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gallery_info->last_attach_time = base::Time::Now(); 5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gallery_info->volume_metadata_valid = true; 5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gallery_info->prefs_version = 2; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefIdSet MediaGalleriesPreferences::LookUpGalleriesByDeviceId( 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id) const { 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeviceIdPrefIdsMap::const_iterator found = device_map_.find(device_id); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found == device_map_.end()) 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MediaGalleryPrefIdSet(); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found->second; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath MediaGalleriesPreferences::LookUpGalleryPathForExtension( 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId gallery_id, 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* extension, 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool include_unpermitted_galleries) { 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(extension); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!include_unpermitted_galleries && 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !ContainsKey(GalleriesForExtension(*extension), gallery_id)) 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleriesPrefInfoMap::const_iterator it = 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.find(gallery_id); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it == known_galleries_.end()) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MediaStorageUtil::FindDevicePathById(it->second.device_id); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPreferences::AddGallery( 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& relative_path, bool user_added, 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& volume_label, const string16& vendor_name, 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& model_name, uint64 total_size_in_bytes, 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time last_attach_time) { 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AddGalleryInternal(device_id, string16(), relative_path, user_added, 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volume_label, vendor_name, model_name, 5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) total_size_in_bytes, last_attach_time, true, 2); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryInternal( 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, const string16& display_name, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& relative_path, bool user_added, 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& volume_label, const string16& vendor_name, 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& model_name, uint64 total_size_in_bytes, 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time last_attach_time, 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool volume_metadata_valid, 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int prefs_version) { 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath normalized_relative_path = 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) relative_path.NormalizePathSeparators(); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefIdSet galleries_on_device = 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LookUpGalleriesByDeviceId(device_id); 610d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (MediaGalleryPrefIdSet::const_iterator pref_id_it = 611d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) galleries_on_device.begin(); 612d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) pref_id_it != galleries_on_device.end(); 613d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ++pref_id_it) { 614d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const MediaGalleryPrefInfo& existing = 615d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) known_galleries_.find(*pref_id_it)->second; 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (existing.path != normalized_relative_path) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool update_gallery_type = 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_added && (existing.type == MediaGalleryPrefInfo::kBlackListed); 62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Status quo: In M27 and M28, galleries added manually use version 0, 62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // and galleries added automatically (including default galleries) use 62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // version 1. The name override is used by default galleries as well 62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // as all device attach events. 6257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // We want to upgrade the name if the existing version is < 2. Leave it 6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // alone if the existing display name is set with version == 2 and the 6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // proposed new name is empty. 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool update_gallery_name = existing.display_name != display_name; 6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (existing.prefs_version == 2 && !existing.display_name.empty() && 6307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) display_name.empty()) { 6317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) update_gallery_name = false; 6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool update_gallery_metadata = volume_metadata_valid && 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ((existing.volume_label != volume_label) || 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.vendor_name != vendor_name) || 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.model_name != model_name) || 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.total_size_in_bytes != total_size_in_bytes) || 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.last_attach_time != last_attach_time)); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!update_gallery_name && !update_gallery_type && 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !update_gallery_metadata) 642d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return *pref_id_it; 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ListPrefUpdate> update( 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ListPrefUpdate(prefs, prefs::kMediaGalleriesRememberedGalleries)); 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListValue* list = update->Get(); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ListValue::const_iterator list_iter = list->begin(); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list_iter != list->end(); 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++list_iter) { 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* dict; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId iter_id; 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*list_iter)->GetAsDictionary(&dict) && 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrefId(*dict, &iter_id) && 656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *pref_id_it == iter_id) { 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update_gallery_type) { 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesTypeKey, 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kMediaGalleriesTypeAutoDetectedValue); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update_gallery_name) 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesDisplayNameKey, display_name); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update_gallery_metadata) { 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVolumeLabelKey, volume_label); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVendorNameKey, vendor_name); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesModelNameKey, model_name); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesSizeKey, total_size_in_bytes); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesLastAttachTimeKey, 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_attach_time.ToInternalValue()); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetInteger(kMediaGalleriesPrefsVersionKey, prefs_version); 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commits the prefs update. 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update.reset(); 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 679d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (update_gallery_name || update_gallery_metadata || 680d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) update_gallery_type) { 681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitFromPrefs(); 682d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(GalleryChangeObserver, 683d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gallery_change_observers_, 684d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnGalleryInfoUpdated(this, *pref_id_it)); 685d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 686d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return *pref_id_it; 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo gallery_info; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.pref_id = prefs->GetUint64(prefs::kMediaGalleriesUniqueId); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->SetUint64(prefs::kMediaGalleriesUniqueId, gallery_info.pref_id + 1); 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.display_name = display_name; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.device_id = device_id; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.path = normalized_relative_path; 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.type = MediaGalleryPrefInfo::kAutoDetected; 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (user_added) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.type = MediaGalleryPrefInfo::kUserAdded; 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (volume_metadata_valid) { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_label = volume_label; 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.vendor_name = vendor_name; 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.model_name = model_name; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.total_size_in_bytes = total_size_in_bytes; 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.last_attach_time = last_attach_time; 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_metadata_valid = volume_metadata_valid; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.prefs_version = prefs_version; 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListPrefUpdate update(prefs, prefs::kMediaGalleriesRememberedGalleries); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListValue* list = update.Get(); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list->Append(CreateGalleryPrefInfoDictionary(gallery_info)); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 715d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitFromPrefs(); 716d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(GalleryChangeObserver, 717d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gallery_change_observers_, 718d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnGalleryAdded(this, gallery_info.pref_id)); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gallery_info.pref_id; 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryByPath( 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo gallery_info; 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (LookUpGalleryByPath(path, &gallery_info) && 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.type != MediaGalleryPrefInfo::kBlackListed) { 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gallery_info.pref_id; 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AddGalleryInternal(gallery_info.device_id, 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.display_name, 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.path, 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /*user added*/, 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_label, 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.vendor_name, 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.model_name, 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.total_size_in_bytes, 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.last_attach_time, 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_metadata_valid, 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.prefs_version); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::ForgetGalleryById(MediaGalleryPrefId pref_id) { 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ListPrefUpdate> update(new ListPrefUpdate( 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs, prefs::kMediaGalleriesRememberedGalleries)); 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ListValue* list = update->Get(); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ContainsKey(known_galleries_, pref_id)) 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ListValue::iterator iter = list->begin(); iter != list->end(); ++iter) { 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* dict; 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId iter_id; 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*iter)->GetAsDictionary(&dict) && GetPrefId(*dict, &iter_id) && 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_id == iter_id) { 757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemoveGalleryPermissionsFromPrefs(pref_id); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo::Type type; 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetType(*dict, &type) && 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type == MediaGalleryPrefInfo::kAutoDetected) { 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesTypeKey, 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kMediaGalleriesTypeBlackListedValue); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list->Erase(iter, NULL); 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) update.reset(NULL); // commits the update. 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 768d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitFromPrefs(); 769d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(GalleryChangeObserver, 770d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gallery_change_observers_, 771d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnGalleryRemoved(this, pref_id)); 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefIdSet MediaGalleriesPreferences::GalleriesForExtension( 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension& extension) const { 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefIdSet result; 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (HasAutoDetectedGalleryPermission(extension)) { 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (MediaGalleriesPrefInfoMap::const_iterator it = 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.begin(); it != known_galleries_.end(); ++it) { 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->second.type == MediaGalleryPrefInfo::kAutoDetected) 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.insert(it->second.pref_id); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<MediaGalleryPermission> stored_permissions = 790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetGalleryPermissionsFromPrefs(extension.id()); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<MediaGalleryPermission>::const_iterator it = 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stored_permissions.begin(); it != stored_permissions.end(); ++it) { 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!it->has_permission) { 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.erase(it->pref_id); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleriesPrefInfoMap::const_iterator gallery = 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.find(it->pref_id); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(gallery != known_galleries_.end()); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery->second.type != MediaGalleryPrefInfo::kBlackListed) { 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.insert(it->pref_id); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << gallery->second.device_id; 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 80968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool MediaGalleriesPreferences::SetGalleryPermissionForExtension( 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension& extension, 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId pref_id, 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_permission) { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The gallery may not exist anymore if the user opened a second config 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface concurrently and removed it. Drop the permission update if so. 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleriesPrefInfoMap::const_iterator gallery_info = 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.find(pref_id); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info == known_galleries_.end()) 81868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 820d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool default_permission = false; 821d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (gallery_info->second.type == MediaGalleryPrefInfo::kAutoDetected) 822d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) default_permission = HasAutoDetectedGalleryPermission(extension); 823d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // When the permission matches the default, we don't need to remember it. 824d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (has_permission == default_permission) { 825d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!UnsetGalleryPermissionInPrefs(extension.id(), pref_id)) 826d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If permission wasn't set, assume nothing has changed. 82768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 829d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!SetGalleryPermissionInPrefs(extension.id(), pref_id, has_permission)) 83068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 832d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (has_permission) 833d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(GalleryChangeObserver, 834d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gallery_change_observers_, 835d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnPermissionAdded(this, extension.id(), pref_id)); 836d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) else 837d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(GalleryChangeObserver, 838d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gallery_change_observers_, 839d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnPermissionRemoved(this, extension.id(), pref_id)); 84068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::Shutdown() { 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_.InvalidateWeakPtrs(); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_ = NULL; 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaGalleriesPreferences::APIHasBeenUsed(Profile* profile) { 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId current_id = 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetPrefs()->GetUint64(prefs::kMediaGalleriesUniqueId); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_id != kInvalidMediaGalleryPrefId + 1; 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid MediaGalleriesPreferences::RegisterProfilePrefs( 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterListPref(prefs::kMediaGalleriesRememberedGalleries, 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterUint64Pref( 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kMediaGalleriesUniqueId, 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kInvalidMediaGalleryPrefId + 1, 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 866d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool MediaGalleriesPreferences::SetGalleryPermissionInPrefs( 867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& extension_id, 868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaGalleryPrefId gallery_id, 869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool has_access) { 870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ExtensionPrefs::ScopedListUpdate update(GetExtensionPrefs(), 871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension_id, 872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kMediaGalleriesPermissions); 873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ListValue* permissions = update.Get(); 874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!permissions) { 875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) permissions = update.Create(); 876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the gallery is already in the list, update the permission... 878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ListValue::iterator iter = permissions->begin(); 879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) iter != permissions->end(); ++iter) { 880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DictionaryValue* dict = NULL; 881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!(*iter)->GetAsDictionary(&dict)) 882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaGalleryPermission perm; 884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!GetMediaGalleryPermissionFromDictionary(dict, &perm)) 885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (perm.pref_id == gallery_id) { 887d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (has_access != perm.has_permission) { 888d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) dict->SetBoolean(kMediaGalleryHasPermissionKey, has_access); 889d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return true; 890d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 891d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 892d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 893868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ...Otherwise, add a new entry for the gallery. 897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DictionaryValue* dict = new DictionaryValue; 898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict->SetString(kMediaGalleryIdKey, base::Uint64ToString(gallery_id)); 899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict->SetBoolean(kMediaGalleryHasPermissionKey, has_access); 900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) permissions->Append(dict); 901d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return true; 902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 904d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool MediaGalleriesPreferences::UnsetGalleryPermissionInPrefs( 905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& extension_id, 906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaGalleryPrefId gallery_id) { 907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ExtensionPrefs::ScopedListUpdate update(GetExtensionPrefs(), 908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension_id, 909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kMediaGalleriesPermissions); 910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ListValue* permissions = update.Get(); 911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!permissions) 912d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ListValue::iterator iter = permissions->begin(); 915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) iter != permissions->end(); ++iter) { 916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DictionaryValue* dict = NULL; 917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!(*iter)->GetAsDictionary(&dict)) 918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaGalleryPermission perm; 920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!GetMediaGalleryPermissionFromDictionary(dict, &perm)) 921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (perm.pref_id == gallery_id) { 923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) permissions->Erase(iter, NULL); 924d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return true; 925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 927d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 930868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::vector<MediaGalleryPermission> 931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MediaGalleriesPreferences::GetGalleryPermissionsFromPrefs( 932868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& extension_id) const { 933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<MediaGalleryPermission> result; 934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const ListValue* permissions; 935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!GetExtensionPrefs()->ReadPrefAsList(extension_id, 936868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kMediaGalleriesPermissions, 937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &permissions)) { 938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return result; 939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ListValue::const_iterator iter = permissions->begin(); 942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) iter != permissions->end(); ++iter) { 943868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DictionaryValue* dict = NULL; 944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!(*iter)->GetAsDictionary(&dict)) 945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaGalleryPermission perm; 947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!GetMediaGalleryPermissionFromDictionary(dict, &perm)) 948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.push_back(perm); 950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 952868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return result; 953868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void MediaGalleriesPreferences::RemoveGalleryPermissionsFromPrefs( 956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaGalleryPrefId gallery_id) { 957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ExtensionPrefs* prefs = GetExtensionPrefs(); 958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DictionaryValue* extensions = 9593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) prefs->pref_service()->GetDictionary(prefs::kExtensionsPref); 960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!extensions) 961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (DictionaryValue::Iterator iter(*extensions); !iter.IsAtEnd(); 964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) iter.Advance()) { 965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!extensions::Extension::IdIsValid(iter.key())) { 966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) UnsetGalleryPermissionInPrefs(iter.key(), gallery_id); 970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 973868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ExtensionPrefs* MediaGalleriesPreferences::GetExtensionPrefs() const { 974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (extension_prefs_for_testing_) 975868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return extension_prefs_for_testing_; 976868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return extensions::ExtensionPrefs::Get(profile_); 977868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 978868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 979868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void MediaGalleriesPreferences::SetExtensionPrefsForTesting( 980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::ExtensionPrefs* extension_prefs) { 981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension_prefs_for_testing_ = extension_prefs; 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 983