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.
5 #include "chrome/browser/ui/webui/options/media_galleries_handler.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_histograms.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"
26 MediaGalleriesHandler::MediaGalleriesHandler() : weak_ptr_factory_(this) {}
28 MediaGalleriesHandler::~MediaGalleriesHandler() {
29 if (select_file_dialog_.get())
30 select_file_dialog_->ListenerDestroyed();
32 Profile* profile = Profile::FromWebUI(web_ui());
33 MediaGalleriesPreferences* preferences =
34 g_browser_process->media_file_system_registry()->GetPreferences(profile);
35 if (preferences->IsInitialized())
36 preferences->RemoveGalleryChangeObserver(this);
39 void MediaGalleriesHandler::GetLocalizedValues(DictionaryValue* values) {
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 },
48 RegisterStrings(values, resources, arraysize(resources));
49 RegisterTitle(values, "manageMediaGalleries",
50 IDS_MEDIA_GALLERY_MANAGE_TITLE);
53 void MediaGalleriesHandler::RegisterMessages() {
54 web_ui()->RegisterMessageCallback(
56 base::Bind(&MediaGalleriesHandler::HandleAddNewGallery,
57 base::Unretained(this)));
58 web_ui()->RegisterMessageCallback(
59 "initializeMediaGalleries",
60 base::Bind(&MediaGalleriesHandler::HandleInitializeMediaGalleries,
61 base::Unretained(this)));
62 web_ui()->RegisterMessageCallback(
64 base::Bind(&MediaGalleriesHandler::HandleForgetGallery,
65 base::Unretained(this)));
68 void MediaGalleriesHandler::OnGalleryAdded(MediaGalleriesPreferences* pref,
69 MediaGalleryPrefId /*pref_id*/) {
70 OnGalleriesChanged(pref);
73 void MediaGalleriesHandler::OnGalleryRemoved(MediaGalleriesPreferences* pref,
74 MediaGalleryPrefId /*pref_id*/) {
75 OnGalleriesChanged(pref);
78 void MediaGalleriesHandler::OnGalleryInfoUpdated(
79 MediaGalleriesPreferences* pref,
80 MediaGalleryPrefId /*pref_id*/) {
81 OnGalleriesChanged(pref);
84 void MediaGalleriesHandler::OnGalleriesChanged(
85 MediaGalleriesPreferences* pref) {
86 DCHECK(pref->IsInitialized());
88 const MediaGalleriesPrefInfoMap& galleries = pref->known_galleries();
89 for (MediaGalleriesPrefInfoMap::const_iterator iter = galleries.begin();
90 iter != galleries.end(); ++iter) {
91 const MediaGalleryPrefInfo& gallery = iter->second;
92 if (gallery.type == MediaGalleryPrefInfo::kBlackListed)
95 DictionaryValue* dict = new DictionaryValue();
96 dict->SetString("displayName", gallery.GetGalleryDisplayName());
97 dict->SetString("path", gallery.AbsolutePath().LossyDisplayName());
98 dict->SetString("id", base::Uint64ToString(gallery.pref_id));
102 web_ui()->CallJavascriptFunction(
103 "options.MediaGalleriesManager.setAvailableMediaGalleries", list);
106 void MediaGalleriesHandler::HandleAddNewGallery(const base::ListValue* args) {
107 select_file_dialog_ = ui::SelectFileDialog::Create(
109 new ChromeSelectFilePolicy(web_ui()->GetWebContents()));
110 select_file_dialog_->SelectFile(
111 ui::SelectFileDialog::SELECT_FOLDER,
112 string16(), // TODO(estade): a name for the dialog?
115 base::FilePath::StringType(),
116 web_ui()->GetWebContents()->GetView()->
117 GetTopLevelNativeWindow(),
121 void MediaGalleriesHandler::HandleInitializeMediaGalleries(
122 const base::ListValue* args) {
123 Profile* profile = Profile::FromWebUI(web_ui());
124 MediaGalleriesPreferences* preferences =
125 g_browser_process->media_file_system_registry()->GetPreferences(profile);
126 preferences->EnsureInitialized(base::Bind(
127 &MediaGalleriesHandler::PreferencesInitialized,
128 weak_ptr_factory_.GetWeakPtr()));
131 void MediaGalleriesHandler::HandleForgetGallery(const base::ListValue* args) {
132 std::string string_id;
134 if (!args->GetString(0, &string_id) ||
135 !base::StringToUint64(string_id, &id)) {
140 media_galleries::UsageCount(media_galleries::WEBUI_FORGET_GALLERY);
141 DCHECK(StorageMonitor::GetInstance()->IsInitialized());
142 MediaGalleriesPreferences* preferences =
143 g_browser_process->media_file_system_registry()->GetPreferences(
144 Profile::FromWebUI(web_ui()));
145 preferences->ForgetGalleryById(id);
148 void MediaGalleriesHandler::FileSelected(const base::FilePath& path,
151 media_galleries::UsageCount(media_galleries::WEBUI_ADD_GALLERY);
152 DCHECK(StorageMonitor::GetInstance()->IsInitialized());
153 MediaGalleriesPreferences* preferences =
154 g_browser_process->media_file_system_registry()->GetPreferences(
155 Profile::FromWebUI(web_ui()));
156 preferences->AddGalleryByPath(path);
159 void MediaGalleriesHandler::PreferencesInitialized() {
160 Profile* profile = Profile::FromWebUI(web_ui());
161 MediaGalleriesPreferences* preferences =
162 g_browser_process->media_file_system_registry()->GetPreferences(profile);
163 DCHECK(preferences->IsInitialized());
164 preferences->RemoveGalleryChangeObserver(this);
165 preferences->AddGalleryChangeObserver(this);
166 OnGalleriesChanged(preferences);
169 } // namespace options