- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / options / media_galleries_handler.cc
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_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"
23
24 namespace options {
25
26 MediaGalleriesHandler::MediaGalleriesHandler() : weak_ptr_factory_(this) {}
27
28 MediaGalleriesHandler::~MediaGalleriesHandler() {
29   if (select_file_dialog_.get())
30     select_file_dialog_->ListenerDestroyed();
31
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);
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::RegisterMessages() {
54   web_ui()->RegisterMessageCallback(
55       "addNewGallery",
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(
63       "forgetGallery",
64       base::Bind(&MediaGalleriesHandler::HandleForgetGallery,
65                  base::Unretained(this)));
66 }
67
68 void MediaGalleriesHandler::OnGalleryAdded(MediaGalleriesPreferences* pref,
69                                            MediaGalleryPrefId /*pref_id*/) {
70   OnGalleriesChanged(pref);
71 }
72
73 void MediaGalleriesHandler::OnGalleryRemoved(MediaGalleriesPreferences* pref,
74                                              MediaGalleryPrefId /*pref_id*/) {
75   OnGalleriesChanged(pref);
76 }
77
78 void MediaGalleriesHandler::OnGalleryInfoUpdated(
79     MediaGalleriesPreferences* pref,
80     MediaGalleryPrefId /*pref_id*/) {
81   OnGalleriesChanged(pref);
82 }
83
84 void MediaGalleriesHandler::OnGalleriesChanged(
85     MediaGalleriesPreferences* pref) {
86   DCHECK(pref->IsInitialized());
87   ListValue list;
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)
93       continue;
94
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));
99     list.Append(dict);
100   }
101
102   web_ui()->CallJavascriptFunction(
103       "options.MediaGalleriesManager.setAvailableMediaGalleries", list);
104 }
105
106 void MediaGalleriesHandler::HandleAddNewGallery(const base::ListValue* args) {
107   select_file_dialog_ = ui::SelectFileDialog::Create(
108       this,
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?
113       base::FilePath(),
114       NULL, 0,
115       base::FilePath::StringType(),
116       web_ui()->GetWebContents()->GetView()->
117           GetTopLevelNativeWindow(),
118       NULL);
119 }
120
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()));
129 }
130
131 void MediaGalleriesHandler::HandleForgetGallery(const base::ListValue* args) {
132   std::string string_id;
133   uint64 id = 0;
134   if (!args->GetString(0, &string_id) ||
135       !base::StringToUint64(string_id, &id)) {
136     NOTREACHED();
137     return;
138   }
139
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);
146 }
147
148 void MediaGalleriesHandler::FileSelected(const base::FilePath& path,
149                                          int index,
150                                          void* params) {
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);
157 }
158
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);
167 }
168
169 }  // namespace options