1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/webui/options/media_galleries_handler.h" 6 7 #include "base/bind.h" 8 #include "base/prefs/pref_service.h" 9 #include "base/strings/string_number_conversions.h" 10 #include "chrome/browser/browser_process.h" 11 #include "chrome/browser/chrome_notification_types.h" 12 #include "chrome/browser/media_galleries/media_file_system_registry.h" 13 #include "chrome/browser/media_galleries/media_galleries_preferences.h" 14 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/storage_monitor/storage_monitor.h" 16 #include "chrome/browser/ui/chrome_select_file_policy.h" 17 #include "chrome/common/pref_names.h" 18 #include "content/public/browser/notification_details.h" 19 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents_view.h" 21 #include "content/public/browser/web_ui.h" 22 #include "grit/generated_resources.h" 23 24 namespace options { 25 26 using chrome::MediaGalleriesPreferences; 27 using chrome::MediaGalleriesPrefInfoMap; 28 using chrome::MediaGalleryPrefInfo; 29 30 MediaGalleriesHandler::MediaGalleriesHandler() 31 : weak_ptr_factory_(this) { 32 } 33 34 MediaGalleriesHandler::~MediaGalleriesHandler() { 35 if (select_file_dialog_.get()) 36 select_file_dialog_->ListenerDestroyed(); 37 } 38 39 void MediaGalleriesHandler::GetLocalizedValues(DictionaryValue* values) { 40 DCHECK(values); 41 42 static OptionsStringResource resources[] = { 43 { "mediaGalleriesSectionLabel", IDS_MEDIA_GALLERY_SECTION_LABEL }, 44 { "manageGalleriesButton", IDS_MEDIA_GALLERY_MANAGE_BUTTON }, 45 { "addNewGalleryButton", IDS_MEDIA_GALLERY_ADD_NEW_BUTTON }, 46 }; 47 48 RegisterStrings(values, resources, arraysize(resources)); 49 RegisterTitle(values, "manageMediaGalleries", 50 IDS_MEDIA_GALLERY_MANAGE_TITLE); 51 } 52 53 void MediaGalleriesHandler::InitializePage() { 54 chrome::StorageMonitor::GetInstance()->EnsureInitialized( 55 base::Bind(&MediaGalleriesHandler::InitializeOnStorageMonitorInit, 56 weak_ptr_factory_.GetWeakPtr())); 57 } 58 59 void MediaGalleriesHandler::InitializeOnStorageMonitorInit() { 60 Profile* profile = Profile::FromWebUI(web_ui()); 61 if (!chrome::MediaGalleriesPreferences::APIHasBeenUsed(profile)) 62 return; 63 64 if (pref_change_registrar_.IsEmpty()) { 65 pref_change_registrar_.Init(profile->GetPrefs()); 66 pref_change_registrar_.Add( 67 prefs::kMediaGalleriesRememberedGalleries, 68 base::Bind(&MediaGalleriesHandler::OnGalleriesChanged, 69 base::Unretained(this))); 70 } 71 72 OnGalleriesChanged(); 73 } 74 75 void MediaGalleriesHandler::RegisterMessages() { 76 chrome::StorageMonitor::GetInstance()->EnsureInitialized( 77 base::Bind(&MediaGalleriesHandler::RegisterOnStorageMonitorInit, 78 weak_ptr_factory_.GetWeakPtr())); 79 } 80 81 void MediaGalleriesHandler::RegisterOnStorageMonitorInit() { 82 web_ui()->RegisterMessageCallback( 83 "addNewGallery", 84 base::Bind(&MediaGalleriesHandler::HandleAddNewGallery, 85 base::Unretained(this))); 86 web_ui()->RegisterMessageCallback( 87 "forgetGallery", 88 base::Bind(&MediaGalleriesHandler::HandleForgetGallery, 89 base::Unretained(this))); 90 } 91 92 void MediaGalleriesHandler::OnGalleriesChanged() { 93 DCHECK(chrome::StorageMonitor::GetInstance()->IsInitialized()); 94 Profile* profile = Profile::FromWebUI(web_ui()); 95 chrome::MediaGalleriesPreferences* preferences = 96 g_browser_process->media_file_system_registry()->GetPreferences(profile); 97 98 ListValue list; 99 const MediaGalleriesPrefInfoMap& galleries = preferences->known_galleries(); 100 for (MediaGalleriesPrefInfoMap::const_iterator iter = galleries.begin(); 101 iter != galleries.end(); ++iter) { 102 const MediaGalleryPrefInfo& gallery = iter->second; 103 if (gallery.type == MediaGalleryPrefInfo::kBlackListed) 104 continue; 105 106 DictionaryValue* dict = new DictionaryValue(); 107 dict->SetString("displayName", gallery.GetGalleryDisplayName()); 108 dict->SetString("path", gallery.AbsolutePath().LossyDisplayName()); 109 dict->SetString("id", base::Uint64ToString(gallery.pref_id)); 110 list.Append(dict); 111 } 112 113 web_ui()->CallJavascriptFunction( 114 "options.MediaGalleriesManager.setAvailableMediaGalleries", list); 115 } 116 117 void MediaGalleriesHandler::HandleAddNewGallery(const base::ListValue* args) { 118 select_file_dialog_ = ui::SelectFileDialog::Create( 119 this, 120 new ChromeSelectFilePolicy(web_ui()->GetWebContents())); 121 select_file_dialog_->SelectFile( 122 ui::SelectFileDialog::SELECT_FOLDER, 123 string16(), // TODO(estade): a name for the dialog? 124 base::FilePath(), 125 NULL, 0, 126 base::FilePath::StringType(), 127 web_ui()->GetWebContents()->GetView()-> 128 GetTopLevelNativeWindow(), 129 NULL); 130 } 131 132 void MediaGalleriesHandler::HandleForgetGallery(const base::ListValue* args) { 133 std::string string_id; 134 uint64 id = 0; 135 if (!args->GetString(0, &string_id) || 136 !base::StringToUint64(string_id, &id)) { 137 NOTREACHED(); 138 return; 139 } 140 141 DCHECK(chrome::StorageMonitor::GetInstance()->IsInitialized()); 142 chrome::MediaGalleriesPreferences* preferences = 143 g_browser_process->media_file_system_registry()->GetPreferences( 144 Profile::FromWebUI(web_ui())); 145 preferences->ForgetGalleryById(id); 146 } 147 148 void MediaGalleriesHandler::FileSelected(const base::FilePath& path, 149 int index, 150 void* params) { 151 DCHECK(chrome::StorageMonitor::GetInstance()->IsInitialized()); 152 chrome::MediaGalleriesPreferences* preferences = 153 g_browser_process->media_file_system_registry()->GetPreferences( 154 Profile::FromWebUI(web_ui())); 155 preferences->AddGalleryByPath(path); 156 } 157 158 } // namespace options 159