Index: chrome/browser/media_gallery/media_galleries_dialog_controller.cc |
diff --git a/chrome/browser/media_gallery/media_galleries_dialog_controller.cc b/chrome/browser/media_gallery/media_galleries_dialog_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0a14d2a8c9401a1bbc787d5a71c49b9fc6469774 |
--- /dev/null |
+++ b/chrome/browser/media_gallery/media_galleries_dialog_controller.cc |
@@ -0,0 +1,185 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/media_gallery/media_galleries_dialog_controller.h" |
+ |
+#include "base/path_service.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/media_gallery/media_galleries_preferences_factory.h" |
+#include "chrome/browser/ui/chrome_select_file_policy.h" |
+#include "chrome/browser/ui/tab_contents/tab_contents.h" |
+#include "chrome/common/chrome_paths.h" |
+#include "chrome/common/extensions/extension.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/browser/web_contents_view.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+using extensions::Extension; |
+ |
+namespace chrome { |
+ |
+MediaGalleriesDialogController::MediaGalleriesDialogController( |
+ TabContents* tab_contents, |
+ const Extension& extension, |
+ const base::Callback<void(void)>& on_finish) |
+ : tab_contents_(tab_contents), |
+ extension_(extension), |
+ on_finish_(on_finish), |
+ preferences_(MediaGalleriesPreferencesFactory::GetForProfile( |
+ tab_contents_->profile())) { |
+ LookUpPermissions(); |
+ |
+#if defined(TOOLKIT_GTK) |
+ dialog_.reset(MediaGalleriesDialog::Create(this)); |
+#else |
+ NOTIMPLEMENTED(); |
+#endif |
+} |
+ |
+MediaGalleriesDialogController::~MediaGalleriesDialogController() { |
+ if (select_folder_dialog_.get()) |
+ select_folder_dialog_->ListenerDestroyed(); |
+} |
+ |
+string16 MediaGalleriesDialogController::GetHeader() { |
+ return l10n_util::GetStringFUTF16(IDS_MEDIA_GALLERIES_DIALOG_HEADER, |
+ UTF8ToUTF16(extension_.name())); |
+} |
+ |
+string16 MediaGalleriesDialogController::GetSubtext() { |
+ if (extension_.HasAPIPermission( |
+ extensions::APIPermission::kMediaGalleriesRead)) { |
+ return l10n_util::GetStringFUTF16(IDS_MEDIA_GALLERIES_DIALOG_READ_SUBTEXT, |
+ UTF8ToUTF16(extension_.name())); |
+ } |
+ // TODO(estade): handle write et al. |
+ return string16(); |
+} |
+ |
+void MediaGalleriesDialogController::OnAddFolderClicked() { |
+ FilePath user_data_dir; |
+ PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
+ // TODO(estade): if file dialogs are disabled we need to handle it somehow. |
+ select_folder_dialog_ = |
+ ui::SelectFileDialog::Create(this, new ChromeSelectFilePolicy(NULL)); |
+ select_folder_dialog_->SelectFile( |
+ ui::SelectFileDialog::SELECT_FOLDER, |
+ l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY_TITLE), |
+ user_data_dir, |
+ NULL, 0, FILE_PATH_LITERAL(""), |
+ tab_contents_->web_contents()->GetView()->GetTopLevelNativeWindow(), |
+ NULL); |
+} |
+ |
+void MediaGalleriesDialogController::GalleryToggled( |
+ const MediaGalleryPrefInfo* gallery, |
+ bool enabled) { |
+ // Check known galleries. |
+ KnownGalleryPermissions::iterator iter = |
+ known_galleries_.find(gallery->pref_id); |
+ if (iter != known_galleries_.end()) { |
+ iter->second.allowed = enabled; |
+ return; |
+ } |
+ |
+ // Check new galleries. |
+ for (NewGalleryPermissions::iterator iter = new_galleries_.begin(); |
+ iter != new_galleries_.end(); ++iter) { |
+ if (&iter->pref_info == gallery) { |
+ iter->allowed = enabled; |
+ return; |
+ } |
+ } |
+ |
+ NOTREACHED(); |
+} |
+ |
+void MediaGalleriesDialogController::DialogFinished(bool accepted) { |
+ if (accepted) |
+ SavePermissions(); |
+ |
+ on_finish_.Run(); |
+ delete this; |
+} |
+ |
+void MediaGalleriesDialogController::FileSelected(const FilePath& path, |
+ int index, |
+ void* params) { |
+ // Try to find it in |known_galleries_|. |
+ MediaGalleryPrefInfo gallery; |
+ if (preferences_->LookUpGalleryByPath(path, &gallery) && |
+ gallery.type != MediaGalleryPrefInfo::kBlackListed) { |
+ KnownGalleryPermissions::iterator iter = |
+ known_galleries_.find(gallery.pref_id); |
+ |
+ if (iter == known_galleries_.end()) { |
+ // This is rare, but could happen if a gallery was not "known" |
+ // when the controller first initialized, but has since been added. |
+ known_galleries_[gallery.pref_id] = GalleryPermission(gallery, true); |
+ iter = known_galleries_.find(gallery.pref_id); |
+ } |
+ |
+ dialog_->UpdateGallery(&iter->second.pref_info, true); |
+ return; |
+ } |
+ |
+ // Try to find it in |new_galleries_| (user added same folder twice). |
+ for (NewGalleryPermissions::iterator iter = new_galleries_.begin(); |
+ iter != new_galleries_.end(); ++iter) { |
+ if (iter->pref_info.path == gallery.path && |
+ iter->pref_info.device_id == gallery.device_id) { |
+ iter->allowed = true; |
+ dialog_->UpdateGallery(&iter->pref_info, true); |
+ return; |
+ } |
+ } |
+ |
+ // Lastly, add it to |new_galleries_|. |
+ new_galleries_.push_back(GalleryPermission(gallery, true)); |
+ dialog_->UpdateGallery(&new_galleries_.back().pref_info, true); |
+} |
+ |
+void MediaGalleriesDialogController::LookUpPermissions() { |
+ for (MediaGalleriesPrefInfoMap::const_iterator iter = |
+ preferences_->known_galleries().begin(); |
+ iter != preferences_->known_galleries().end(); |
+ ++iter) { |
+ if (iter->second.type == MediaGalleryPrefInfo::kBlackListed) |
+ continue; |
+ |
+ known_galleries_[iter->first] = GalleryPermission(iter->second, false); |
+ } |
+ |
+ std::set<MediaGalleryPrefId> permitted = |
+ preferences_->GalleriesForExtension(extension_); |
+ |
+ for (std::set<MediaGalleryPrefId>::iterator iter = permitted.begin(); |
+ iter != permitted.end(); ++iter) { |
+ known_galleries_[*iter].allowed = true; |
+ } |
+} |
+ |
+void MediaGalleriesDialogController::SavePermissions() { |
+ for (KnownGalleryPermissions::iterator iter = known_galleries_.begin(); |
+ iter != known_galleries_.end(); ++iter) { |
+ preferences_->SetGalleryPermissionForExtension( |
+ extension_, iter->first, iter->second.allowed); |
+ } |
+ |
+ for (NewGalleryPermissions::iterator iter = new_galleries_.begin(); |
+ iter != new_galleries_.end(); ++iter) { |
+ // If the user added a gallery then unchecked it, forget about it. |
+ if (!iter->allowed) |
+ continue; |
+ |
+ const MediaGalleryPrefInfo& gallery = iter->pref_info; |
+ MediaGalleryPrefId id = preferences_->AddGallery( |
+ gallery.device_id, gallery.display_name, gallery.path, true); |
+ preferences_->SetGalleryPermissionForExtension( |
+ extension_, id, true); |
+ } |
+} |
+ |
+} // namespace chrome |