media_galleries_preferences.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/gallery_watch_state_tracker.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_prefs.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/storage_monitor/media_storage_util.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/permissions/api_permission.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/permissions/media_galleries_permission.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesDeviceIdKey[] = "deviceId"; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesDisplayNameKey[] = "displayName"; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesPathKey[] = "path"; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesPrefIdKey[] = "prefId"; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeKey[] = "type"; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesVolumeLabelKey[] = "volumeLabel"; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesVendorNameKey[] = "vendorName"; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesModelNameKey[] = "modelName"; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesSizeKey[] = "totalSize"; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesLastAttachTimeKey[] = "lastAttachTime"; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesPrefsVersionKey[] = "preferencesVersion"; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeAutoDetectedValue[] = "autoDetected"; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeUserAddedValue[] = "userAdded"; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMediaGalleriesTypeBlackListedValue[] = "blackListed"; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetPrefId(const DictionaryValue& dict, MediaGalleryPrefId* value) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string string_id; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dict.GetString(kMediaGalleriesPrefIdKey, &string_id) || 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !base::StringToUint64(string_id, value)) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetType(const DictionaryValue& dict, MediaGalleryPrefInfo::Type* type) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string string_type; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dict.GetString(kMediaGalleriesTypeKey, &string_type)) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_type == kMediaGalleriesTypeAutoDetectedValue) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *type = MediaGalleryPrefInfo::kAutoDetected; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_type == kMediaGalleriesTypeUserAddedValue) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *type = MediaGalleryPrefInfo::kUserAdded; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_type == kMediaGalleriesTypeBlackListedValue) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *type = MediaGalleryPrefInfo::kBlackListed; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PopulateGalleryPrefInfoFromDictionary( 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValue& dict, MediaGalleryPrefInfo* out_gallery_info) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId pref_id; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 display_name; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string device_id; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType path; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo::Type type = MediaGalleryPrefInfo::kAutoDetected; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 volume_label; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 vendor_name; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 model_name; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double total_size_in_bytes = 0.0; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double last_attach_time = 0.0; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool volume_metadata_valid = false; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int prefs_version = 0; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetPrefId(dict, &pref_id) || 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !dict.GetString(kMediaGalleriesDeviceIdKey, &device_id) || 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !dict.GetString(kMediaGalleriesPathKey, &path) || 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !GetType(dict, &type)) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetString(kMediaGalleriesDisplayNameKey, &display_name); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetInteger(kMediaGalleriesPrefsVersionKey, &prefs_version); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dict.GetString(kMediaGalleriesVolumeLabelKey, &volume_label) && 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetString(kMediaGalleriesVendorNameKey, &vendor_name) && 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetString(kMediaGalleriesModelNameKey, &model_name) && 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetDouble(kMediaGalleriesSizeKey, &total_size_in_bytes) && 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.GetDouble(kMediaGalleriesLastAttachTimeKey, &last_attach_time)) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volume_metadata_valid = true; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->pref_id = pref_id; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->display_name = display_name; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->device_id = device_id; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->path = base::FilePath(path); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->type = type; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->volume_label = volume_label; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->vendor_name = vendor_name; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->model_name = model_name; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->total_size_in_bytes = total_size_in_bytes; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->last_attach_time = 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::FromInternalValue(last_attach_time); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->volume_metadata_valid = volume_metadata_valid; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out_gallery_info->prefs_version = prefs_version; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryValue* CreateGalleryPrefInfoDictionary( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaGalleryPrefInfo& gallery) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* dict = new DictionaryValue(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesPrefIdKey, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Uint64ToString(gallery.pref_id)); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gallery.volume_metadata_valid) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesDisplayNameKey, gallery.display_name); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesDeviceIdKey, gallery.device_id); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesPathKey, gallery.path.value()); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* type = NULL; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (gallery.type) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MediaGalleryPrefInfo::kAutoDetected: 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type = kMediaGalleriesTypeAutoDetectedValue; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MediaGalleryPrefInfo::kUserAdded: 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type = kMediaGalleriesTypeUserAddedValue; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case MediaGalleryPrefInfo::kBlackListed: 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type = kMediaGalleriesTypeBlackListedValue; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesTypeKey, type); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery.volume_metadata_valid) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVolumeLabelKey, gallery.volume_label); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVendorNameKey, gallery.vendor_name); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesModelNameKey, gallery.model_name); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesSizeKey, gallery.total_size_in_bytes); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesLastAttachTimeKey, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery.last_attach_time.ToInternalValue()); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Version 0 of the prefs format was that the display_name was always 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // used to show the user-visible name of the gallery. Version 1 means 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that there is an optional display_name, and when it is present, it 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overrides the name that would be built from the volume metadata, path, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or whatever other data. So if we see a display_name with version 0, it 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // means it may be overwritten simply by getting new volume metadata. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A display_name with version 1 should not be overwritten. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetInteger(kMediaGalleriesPrefsVersionKey, gallery.prefs_version); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dict; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HasAutoDetectedGalleryPermission(const extensions::Extension& extension) { 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::MediaGalleriesPermission::CheckParam param( 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::MediaGalleriesPermission::kAllAutoDetectedPermission); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extension.CheckAPIPermissionWithParam( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::APIPermission::kMediaGalleries, ¶m); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefInfo::MediaGalleryPrefInfo() 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : pref_id(kInvalidMediaGalleryPrefId), 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(kInvalidType), 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_size_in_bytes(0), 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volume_metadata_valid(false), 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_version(0) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefInfo::~MediaGalleryPrefInfo() {} 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath MediaGalleryPrefInfo::AbsolutePath() const { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath base_path = MediaStorageUtil::FindDevicePathById(device_id); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base_path.empty() ? base_path : base_path.Append(path); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPreferences::GalleryChangeObserver::~GalleryChangeObserver() {} 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPreferences::MediaGalleriesPreferences(Profile* profile) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : profile_(profile) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddDefaultGalleriesIfFreshProfile(); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitFromPrefs(false /*no notification*/); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPreferences::~MediaGalleriesPreferences() {} 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::AddDefaultGalleriesIfFreshProfile() { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only add defaults the first time. 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (APIHasBeenUsed(profile_)) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fresh profile case. 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kDirectoryKeys[] = { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DIR_USER_MUSIC, 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DIR_USER_PICTURES, 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DIR_USER_VIDEOS, 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(kDirectoryKeys); ++i) { 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PathService::Get(kDirectoryKeys[i], &path)) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath relative_path; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StorageInfo info; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path)) { 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(gbillock): Add in the volume metadata here when available. 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddGalleryWithName(info.device_id, info.name, relative_path, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false /*user added*/); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::InitFromPrefs(bool notify_observers) { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.clear(); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_map_.clear(); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ListValue* list = prefs->GetList( 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kMediaGalleriesRememberedGalleries); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (list) { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ListValue::const_iterator it = list->begin(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != list->end(); ++it) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValue* dict = NULL; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!(*it)->GetAsDictionary(&dict)) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo gallery_info; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PopulateGalleryPrefInfoFromDictionary(*dict, &gallery_info)) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_[gallery_info.pref_id] = gallery_info; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_map_[gallery_info.device_id].insert(gallery_info.pref_id); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (notify_observers) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyChangeObservers(""); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::NotifyChangeObservers( 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(GalleryChangeObserver, 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_change_observers_, 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnGalleryChanged(this, extension_id)); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::AddGalleryChangeObserver( 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryChangeObserver* observer) { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_change_observers_.AddObserver(observer); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::RemoveGalleryChangeObserver( 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryChangeObserver* observer) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_change_observers_.RemoveObserver(observer); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::OnRemovableStorageAttached( 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StorageInfo& info) { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MediaStorageUtil::IsMediaDevice(info.device_id)) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (info.name.empty()) { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddGallery(info.device_id, base::FilePath(info.location), 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false /*not user added*/, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.storage_label, 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.vendor_name, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.model_name, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.total_size_in_bytes, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::Now()); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddGalleryWithName(info.device_id, info.name, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(info.location), false); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaGalleriesPreferences::LookUpGalleryByPath( 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo* gallery_info) const { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StorageInfo info; 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath relative_path; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path)) { 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *gallery_info = MediaGalleryPrefInfo(); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) relative_path = relative_path.NormalizePathSeparators(); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefIdSet galleries_on_device = 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LookUpGalleriesByDeviceId(info.device_id); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (MediaGalleryPrefIdSet::const_iterator it = galleries_on_device.begin(); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != galleries_on_device.end(); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaGalleryPrefInfo& gallery = known_galleries_.find(*it)->second; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery.path != relative_path) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *gallery_info = gallery; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This method is called by controller::FilesSelected when the user 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // adds a new gallery. Control reaches here when the selected gallery is 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on a volume we know about, but have no gallery already for. Returns 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hypothetical data to the caller about what the prefs will look like 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the gallery is added. 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(gbillock): split this out into another function so it doesn't 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // conflate LookUp. 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info) { 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->pref_id = kInvalidMediaGalleryPrefId; 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->display_name = info.name; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->device_id = info.device_id; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->path = relative_path; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info->type = MediaGalleryPrefInfo::kUserAdded; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(gbillock): Need to add volume metadata here from |info|. 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefIdSet MediaGalleriesPreferences::LookUpGalleriesByDeviceId( 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id) const { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeviceIdPrefIdsMap::const_iterator found = device_map_.find(device_id); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found == device_map_.end()) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MediaGalleryPrefIdSet(); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found->second; 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath MediaGalleriesPreferences::LookUpGalleryPathForExtension( 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId gallery_id, 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* extension, 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool include_unpermitted_galleries) { 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(extension); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!include_unpermitted_galleries && 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !ContainsKey(GalleriesForExtension(*extension), gallery_id)) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleriesPrefInfoMap::const_iterator it = 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.find(gallery_id); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it == known_galleries_.end()) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MediaStorageUtil::FindDevicePathById(it->second.device_id); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPreferences::AddGallery( 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& relative_path, bool user_added, 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& volume_label, const string16& vendor_name, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& model_name, uint64 total_size_in_bytes, 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time last_attach_time) { 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AddGalleryInternal(device_id, string16(), relative_path, user_added, 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volume_label, vendor_name, model_name, 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_size_in_bytes, last_attach_time, true, 1); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryWithName( 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, const string16& display_name, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& relative_path, bool user_added) { 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AddGalleryInternal(device_id, display_name, relative_path, user_added, 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), string16(), string16(), 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, base::Time(), false, 1); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryInternal( 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, const string16& display_name, 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& relative_path, bool user_added, 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& volume_label, const string16& vendor_name, 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& model_name, uint64 total_size_in_bytes, 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time last_attach_time, 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool volume_metadata_valid, 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int prefs_version) { 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath normalized_relative_path = 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) relative_path.NormalizePathSeparators(); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefIdSet galleries_on_device = 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LookUpGalleriesByDeviceId(device_id); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (MediaGalleryPrefIdSet::const_iterator it = galleries_on_device.begin(); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != galleries_on_device.end(); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaGalleryPrefInfo& existing = known_galleries_.find(*it)->second; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (existing.path != normalized_relative_path) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool update_gallery_type = 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_added && (existing.type == MediaGalleryPrefInfo::kBlackListed); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool update_gallery_name = existing.display_name != display_name; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool update_gallery_metadata = volume_metadata_valid && 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ((existing.volume_label != volume_label) || 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.vendor_name != vendor_name) || 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.model_name != model_name) || 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.total_size_in_bytes != total_size_in_bytes) || 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (existing.last_attach_time != last_attach_time)); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!update_gallery_name && !update_gallery_type && 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !update_gallery_metadata) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *it; 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ListPrefUpdate> update( 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ListPrefUpdate(prefs, prefs::kMediaGalleriesRememberedGalleries)); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListValue* list = update->Get(); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ListValue::const_iterator list_iter = list->begin(); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list_iter != list->end(); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++list_iter) { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* dict; 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId iter_id; 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*list_iter)->GetAsDictionary(&dict) && 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrefId(*dict, &iter_id) && 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *it == iter_id) { 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update_gallery_type) { 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesTypeKey, 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kMediaGalleriesTypeAutoDetectedValue); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update_gallery_name) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesDisplayNameKey, display_name); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update_gallery_metadata) { 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVolumeLabelKey, volume_label); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesVendorNameKey, vendor_name); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesModelNameKey, model_name); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesSizeKey, total_size_in_bytes); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetDouble(kMediaGalleriesLastAttachTimeKey, 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_attach_time.ToInternalValue()); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetInteger(kMediaGalleriesPrefsVersionKey, prefs_version); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commits the prefs update. 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update.reset(); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update_gallery_name || update_gallery_metadata || update_gallery_type) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitFromPrefs(true /* notify observers */); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *it; 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo gallery_info; 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.pref_id = prefs->GetUint64(prefs::kMediaGalleriesUniqueId); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->SetUint64(prefs::kMediaGalleriesUniqueId, gallery_info.pref_id + 1); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.display_name = display_name; 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.device_id = device_id; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.path = normalized_relative_path; 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.type = MediaGalleryPrefInfo::kAutoDetected; 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (user_added) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.type = MediaGalleryPrefInfo::kUserAdded; 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (volume_metadata_valid) { 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_label = volume_label; 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.vendor_name = vendor_name; 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.model_name = model_name; 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.total_size_in_bytes = total_size_in_bytes; 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.last_attach_time = last_attach_time; 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_metadata_valid = volume_metadata_valid; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.prefs_version = prefs_version; 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListPrefUpdate update(prefs, prefs::kMediaGalleriesRememberedGalleries); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListValue* list = update.Get(); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list->Append(CreateGalleryPrefInfoDictionary(gallery_info)); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitFromPrefs(true /* notify observers */); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gallery_info.pref_id; 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPreferences::AddGalleryByPath( 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo gallery_info; 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (LookUpGalleryByPath(path, &gallery_info) && 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.type != MediaGalleryPrefInfo::kBlackListed) { 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gallery_info.pref_id; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AddGalleryInternal(gallery_info.device_id, 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.display_name, 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.path, 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /*user added*/, 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_label, 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.vendor_name, 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.model_name, 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.total_size_in_bytes, 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.last_attach_time, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.volume_metadata_valid, 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_info.prefs_version); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::ForgetGalleryById(MediaGalleryPrefId pref_id) { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListPrefUpdate update(prefs, prefs::kMediaGalleriesRememberedGalleries); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListValue* list = update.Get(); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ContainsKey(known_galleries_, pref_id)) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ListValue::iterator iter = list->begin(); iter != list->end(); ++iter) { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* dict; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId iter_id; 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*iter)->GetAsDictionary(&dict) && GetPrefId(*dict, &iter_id) && 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_id == iter_id) { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionPrefs()->RemoveMediaGalleryPermissions(pref_id); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefInfo::Type type; 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetType(*dict, &type) && 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type == MediaGalleryPrefInfo::kAutoDetected) { 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString(kMediaGalleriesTypeKey, 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kMediaGalleriesTypeBlackListedValue); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list->Erase(iter, NULL); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitFromPrefs(true /* notify observers */); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleryPrefIdSet MediaGalleriesPreferences::GalleriesForExtension( 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension& extension) const { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefIdSet result; 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (HasAutoDetectedGalleryPermission(extension)) { 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (MediaGalleriesPrefInfoMap::const_iterator it = 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.begin(); it != known_galleries_.end(); ++it) { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->second.type == MediaGalleryPrefInfo::kAutoDetected) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.insert(it->second.pref_id); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<MediaGalleryPermission> stored_permissions = 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionPrefs()->GetMediaGalleryPermissions(extension.id()); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<MediaGalleryPermission>::const_iterator it = 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stored_permissions.begin(); it != stored_permissions.end(); ++it) { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!it->has_permission) { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.erase(it->pref_id); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleriesPrefInfoMap::const_iterator gallery = 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.find(it->pref_id); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(gallery != known_galleries_.end()); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery->second.type != MediaGalleryPrefInfo::kBlackListed) { 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.insert(it->pref_id); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << gallery->second.device_id; 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::SetGalleryPermissionForExtension( 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension& extension, 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId pref_id, 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_permission) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The gallery may not exist anymore if the user opened a second config 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface concurrently and removed it. Drop the permission update if so. 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleriesPrefInfoMap::const_iterator gallery_info = 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) known_galleries_.find(pref_id); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info == known_galleries_.end()) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::GalleryWatchStateTracker* state_tracker = 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::GalleryWatchStateTracker::GetForProfile(profile_); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool all_permission = HasAutoDetectedGalleryPermission(extension); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_permission && all_permission) { 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_info->second.type == MediaGalleryPrefInfo::kAutoDetected) { 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionPrefs()->UnsetMediaGalleryPermission(extension.id(), pref_id); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyChangeObservers(extension.id()); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (state_tracker) { 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_tracker->OnGalleryPermissionChanged(extension.id(), pref_id, 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!has_permission && !all_permission) { 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionPrefs()->UnsetMediaGalleryPermission(extension.id(), pref_id); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionPrefs()->SetMediaGalleryPermission(extension.id(), pref_id, 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_permission); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyChangeObservers(extension.id()); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (state_tracker) { 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_tracker->OnGalleryPermissionChanged(extension.id(), pref_id, 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_permission); 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::Shutdown() { 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_ = NULL; 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaGalleriesPreferences::APIHasBeenUsed(Profile* profile) { 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaGalleryPrefId current_id = 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetPrefs()->GetUint64(prefs::kMediaGalleriesUniqueId); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_id != kInvalidMediaGalleryPrefId + 1; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPreferences::RegisterUserPrefs( 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable* registry) { 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterListPref(prefs::kMediaGalleriesRememberedGalleries, 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable::UNSYNCABLE_PREF); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterUint64Pref(prefs::kMediaGalleriesUniqueId, 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kInvalidMediaGalleryPrefId + 1, 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable::UNSYNCABLE_PREF); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extensions::ExtensionPrefs* 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaGalleriesPreferences::GetExtensionPrefs() const { 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile_)->extension_service(); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extension_service->extension_prefs(); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chrome 646