Home | History | Annotate | Download | only in options
      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