146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_permission_controller.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/base_paths.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/path_service.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/stl_util.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/browser_process.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/extensions/api/file_system/file_system_api.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_histograms.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_gallery_context_menu.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/storage_monitor/storage_info.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/storage_monitor/storage_monitor.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/web_contents.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/browser/extension_prefs.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/extension.h"
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/media_galleries_permission.h"
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/text/bytes_formatting.h"
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using extensions::APIPermission;
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using extensions::Extension;
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using storage_monitor::StorageInfo;
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using storage_monitor::StorageMonitor;
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace {
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Comparator for sorting gallery entries. Sort Removable entries above
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// non-removable ones. Within those two groups, sort on media counts
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// if populated, otherwise on paths.
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool GalleriesVectorComparator(
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const MediaGalleriesDialogController::Entry& a,
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const MediaGalleriesDialogController::Entry& b) {
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (StorageInfo::IsRemovableDevice(a.pref_info.device_id) !=
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      StorageInfo::IsRemovableDevice(b.pref_info.device_id)) {
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return StorageInfo::IsRemovableDevice(a.pref_info.device_id);
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int a_media_count = a.pref_info.audio_count + a.pref_info.image_count +
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      a.pref_info.video_count;
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int b_media_count = b.pref_info.audio_count + b.pref_info.image_count +
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      b.pref_info.video_count;
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (a_media_count != b_media_count)
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return a_media_count > b_media_count;
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return a.pref_info.AbsolutePath() < b.pref_info.AbsolutePath();
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::MediaGalleriesPermissionController(
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    content::WebContents* web_contents,
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const Extension& extension,
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::Closure& on_finish)
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : web_contents_(web_contents),
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        extension_(&extension),
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        on_finish_(on_finish),
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        preferences_(
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            g_browser_process->media_file_system_registry()->GetPreferences(
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                GetProfile())),
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        create_dialog_callback_(base::Bind(&MediaGalleriesDialog::Create)) {
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Passing unretained pointer is safe, since the dialog controller
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // is self-deleting, and so won't be deleted until it can be shown
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // and then closed.
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  preferences_->EnsureInitialized(
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&MediaGalleriesPermissionController::OnPreferencesInitialized,
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Unretained is safe because |this| owns |context_menu_|.
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  context_menu_.reset(
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      new MediaGalleryContextMenu(
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          base::Bind(&MediaGalleriesPermissionController::DidForgetEntry,
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     base::Unretained(this))));
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnPreferencesInitialized() {
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (StorageMonitor::GetInstance())
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    StorageMonitor::GetInstance()->AddObserver(this);
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // |preferences_| may be NULL in tests.
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (preferences_) {
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    preferences_->AddGalleryChangeObserver(this);
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InitializePermissions();
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  dialog_.reset(create_dialog_callback_.Run(this));
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::MediaGalleriesPermissionController(
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const extensions::Extension& extension,
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesPreferences* preferences,
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const CreateDialogCallback& create_dialog_callback,
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::Closure& on_finish)
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : web_contents_(NULL),
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_(&extension),
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      on_finish_(on_finish),
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      preferences_(preferences),
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      create_dialog_callback_(create_dialog_callback) {
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnPreferencesInitialized();
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::~MediaGalleriesPermissionController() {
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (StorageMonitor::GetInstance())
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    StorageMonitor::GetInstance()->RemoveObserver(this);
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // |preferences_| may be NULL in tests.
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (preferences_)
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    preferences_->RemoveGalleryChangeObserver(this);
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (select_folder_dialog_.get())
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    select_folder_dialog_->ListenerDestroyed();
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesPermissionController::GetHeader() const {
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_MEDIA_GALLERIES_DIALOG_HEADER,
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    base::UTF8ToUTF16(extension_->name()));
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesPermissionController::GetSubtext() const {
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  extensions::MediaGalleriesPermission::CheckParam copy_to_param(
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::MediaGalleriesPermission::kCopyToPermission);
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  extensions::MediaGalleriesPermission::CheckParam delete_param(
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::MediaGalleriesPermission::kDeletePermission);
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const extensions::PermissionsData* permission_data =
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_->permissions_data();
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool has_copy_to_permission = permission_data->CheckAPIPermissionWithParam(
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kMediaGalleries, &copy_to_param);
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool has_delete_permission = permission_data->CheckAPIPermissionWithParam(
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kMediaGalleries, &delete_param);
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int id;
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (has_copy_to_permission)
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    id = IDS_MEDIA_GALLERIES_DIALOG_SUBTEXT_READ_WRITE;
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else if (has_delete_permission)
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    id = IDS_MEDIA_GALLERIES_DIALOG_SUBTEXT_READ_DELETE;
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    id = IDS_MEDIA_GALLERIES_DIALOG_SUBTEXT_READ_ONLY;
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return l10n_util::GetStringFUTF16(id, base::UTF8ToUTF16(extension_->name()));
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaGalleriesPermissionController::IsAcceptAllowed() const {
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!toggled_galleries_.empty() || !forgotten_galleries_.empty())
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return true;
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GalleryPermissionsMap::const_iterator iter = new_galleries_.begin();
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iter != new_galleries_.end();
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ++iter) {
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (iter->second.selected)
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return true;
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return false;
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaGalleriesPermissionController::ShouldShowFolderViewer(
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const Entry& entry) const {
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return false;
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::vector<base::string16>
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::GetSectionHeaders() const {
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<base::string16> result;
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  result.push_back(base::string16());  // First section has no header.
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  result.push_back(
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_PERMISSION_SUGGESTIONS));
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return result;
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Note: sorts by display criterion: GalleriesVectorComparator.
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesDialogController::Entries
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::GetSectionEntries(size_t index) const {
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_GT(2U, index);  // This dialog only has two sections.
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool existing = !index;
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesDialogController::Entries result;
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GalleryPermissionsMap::const_iterator iter = known_galleries_.begin();
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iter != known_galleries_.end(); ++iter) {
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MediaGalleryPrefId pref_id = GetPrefId(iter->first);
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!ContainsKey(forgotten_galleries_, iter->first) &&
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        existing == ContainsKey(pref_permitted_galleries_, pref_id)) {
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      result.push_back(iter->second);
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (existing) {
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    for (GalleryPermissionsMap::const_iterator iter = new_galleries_.begin();
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         iter != new_galleries_.end(); ++iter) {
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      result.push_back(iter->second);
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::sort(result.begin(), result.end(), GalleriesVectorComparator);
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return result;
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::GetAuxiliaryButtonText() const {
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY);
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// This is the 'Add Folder' button.
20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidClickAuxiliaryButton() {
21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::FilePath default_path =
21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::file_system_api::GetLastChooseEntryDirectory(
21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          extensions::ExtensionPrefs::Get(GetProfile()), extension_->id());
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (default_path.empty())
21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    PathService::Get(base::DIR_USER_DESKTOP, &default_path);
21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  select_folder_dialog_ =
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::SelectFileDialog::Create(this, new ChromeSelectFilePolicy(NULL));
21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  select_folder_dialog_->SelectFile(
21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::SelectFileDialog::SELECT_FOLDER,
21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY_TITLE),
22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      default_path,
22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NULL,
22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      0,
22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::FilePath::StringType(),
22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      web_contents_->GetTopLevelNativeWindow(),
22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NULL);
22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidToggleEntry(
22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryDialogId gallery_id, bool selected) {
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Check known galleries.
23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GalleryPermissionsMap::iterator iter = known_galleries_.find(gallery_id);
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (iter != known_galleries_.end()) {
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (iter->second.selected == selected)
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    iter->second.selected = selected;
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    toggled_galleries_[gallery_id] = selected;
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  iter = new_galleries_.find(gallery_id);
24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (iter != new_galleries_.end())
24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    iter->second.selected = selected;
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Don't sort -- the dialog is open, and we don't want to adjust any
24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // positions for future updates to the dialog contents until they are
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // redrawn.
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidClickOpenFolderViewer(
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryDialogId gallery_id) {
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NOTREACHED();
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidForgetEntry(
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryDialogId gallery_id) {
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  media_galleries::UsageCount(media_galleries::DIALOG_FORGET_GALLERY);
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!new_galleries_.erase(gallery_id)) {
25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(ContainsKey(known_galleries_, gallery_id));
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    forgotten_galleries_.insert(gallery_id);
26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  dialog_->UpdateGalleries();
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesPermissionController::GetAcceptButtonText() const {
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_CONFIRM);
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DialogFinished(bool accepted) {
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The dialog has finished, so there is no need to watch for more updates
27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // from |preferences_|.
27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // |preferences_| may be NULL in tests.
27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (preferences_)
27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    preferences_->RemoveGalleryChangeObserver(this);
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (accepted)
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SavePermissions();
27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  on_finish_.Run();
28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delete this;
28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)content::WebContents* MediaGalleriesPermissionController::WebContents() {
28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return web_contents_;
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::FileSelected(
28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::FilePath& path,
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    int /*index*/,
29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    void* /*params*/) {
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |web_contents_| is NULL in tests.
293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (web_contents_) {
294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    extensions::file_system_api::SetLastChooseEntryDirectory(
295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          extensions::ExtensionPrefs::Get(GetProfile()),
296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          extension_->id(),
297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          path);
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Try to find it in the prefs.
30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleryPrefInfo gallery;
30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(preferences_);
30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool gallery_exists = preferences_->LookUpGalleryByPath(path, &gallery);
30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (gallery_exists && !gallery.IsBlackListedType()) {
30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // The prefs are in sync with |known_galleries_|, so it should exist in
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // |known_galleries_| as well. User selecting a known gallery effectively
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // just sets the gallery to permitted.
30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryDialogId gallery_id = GetDialogId(gallery.pref_id);
30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryPermissionsMap::iterator iter = known_galleries_.find(gallery_id);
31046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(iter != known_galleries_.end());
31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    iter->second.selected = true;
31246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    forgotten_galleries_.erase(gallery_id);
31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    dialog_->UpdateGalleries();
31446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
31546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Try to find it in |new_galleries_| (user added same folder twice).
31846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GalleryPermissionsMap::iterator iter = new_galleries_.begin();
31946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iter != new_galleries_.end(); ++iter) {
32046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (iter->second.pref_info.path == gallery.path &&
32146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        iter->second.pref_info.device_id == gallery.device_id) {
32246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      iter->second.selected = true;
32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      dialog_->UpdateGalleries();
32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
32646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
32746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
32846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Lastly, if not found, add a new gallery to |new_galleries_|.
329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // prefId == kInvalidMediaGalleryPrefId for completely new galleries.
330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The old prefId is retained for blacklisted galleries.
331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gallery.pref_id = GetDialogId(gallery.pref_id);
33246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  new_galleries_[gallery.pref_id] = Entry(gallery, true);
33346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  dialog_->UpdateGalleries();
33446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
33646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnRemovableStorageAttached(
33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const StorageInfo& info) {
33846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateGalleriesOnDeviceEvent(info.device_id());
33946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
34046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnRemovableStorageDetached(
34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const StorageInfo& info) {
34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateGalleriesOnDeviceEvent(info.device_id());
34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnPermissionAdded(
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesPreferences* /* prefs */,
34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& extension_id,
34946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId /* pref_id */) {
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (extension_id != extension_->id())
35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateGalleriesOnPreferencesEvent();
35346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnPermissionRemoved(
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesPreferences* /* prefs */,
35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& extension_id,
35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId /* pref_id */) {
35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (extension_id != extension_->id())
36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateGalleriesOnPreferencesEvent();
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnGalleryAdded(
36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesPreferences* /* prefs */,
36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId /* pref_id */) {
36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateGalleriesOnPreferencesEvent();
36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnGalleryRemoved(
37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesPreferences* /* prefs */,
37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId /* pref_id */) {
37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateGalleriesOnPreferencesEvent();
37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnGalleryInfoUpdated(
37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesPreferences* prefs,
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId pref_id) {
37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(preferences_);
38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const MediaGalleriesPrefInfoMap& pref_galleries =
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      preferences_->known_galleries();
38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesPrefInfoMap::const_iterator pref_it =
38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pref_galleries.find(pref_id);
38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (pref_it == pref_galleries.end())
38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const MediaGalleryPrefInfo& gallery_info = pref_it->second;
38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UpdateGalleriesOnDeviceEvent(gallery_info.device_id);
38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::InitializePermissions() {
39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  known_galleries_.clear();
39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(preferences_);
39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const MediaGalleriesPrefInfoMap& galleries = preferences_->known_galleries();
39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (MediaGalleriesPrefInfoMap::const_iterator iter = galleries.begin();
39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iter != galleries.end();
39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ++iter) {
39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const MediaGalleryPrefInfo& gallery = iter->second;
39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (gallery.IsBlackListedType())
39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      continue;
40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryDialogId gallery_id = GetDialogId(gallery.pref_id);
40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    known_galleries_[gallery_id] = Entry(gallery, false);
40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    known_galleries_[gallery_id].pref_info.pref_id = gallery_id;
40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pref_permitted_galleries_ = preferences_->GalleriesForExtension(*extension_);
40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (MediaGalleryPrefIdSet::iterator iter = pref_permitted_galleries_.begin();
409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       iter != pref_permitted_galleries_.end();
410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       ++iter) {
41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryDialogId gallery_id = GetDialogId(*iter);
41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(ContainsKey(known_galleries_, gallery_id));
41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    known_galleries_[gallery_id].selected = true;
41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Preserve state of toggled galleries.
417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (ToggledGalleryMap::const_iterator iter = toggled_galleries_.begin();
418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       iter != toggled_galleries_.end();
419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       ++iter) {
420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    known_galleries_[iter->first].selected = iter->second;
421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::SavePermissions() {
42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(preferences_);
42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  media_galleries::UsageCount(media_galleries::SAVE_DIALOG);
42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GalleryPermissionsMap::const_iterator iter = known_galleries_.begin();
42846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iter != known_galleries_.end(); ++iter) {
42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId pref_id = GetPrefId(iter->first);
43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (ContainsKey(forgotten_galleries_, iter->first)) {
43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      preferences_->ForgetGalleryById(pref_id);
43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      bool changed = preferences_->SetGalleryPermissionForExtension(
43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          *extension_, pref_id, iter->second.selected);
43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (changed) {
43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        if (iter->second.selected) {
43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          media_galleries::UsageCount(
43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              media_galleries::DIALOG_PERMISSION_ADDED);
43946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        } else {
44046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          media_galleries::UsageCount(
44146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              media_galleries::DIALOG_PERMISSION_REMOVED);
44246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        }
44346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      }
44446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
44546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
44646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
44746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GalleryPermissionsMap::const_iterator iter = new_galleries_.begin();
44846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iter != new_galleries_.end(); ++iter) {
44946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    media_galleries::UsageCount(media_galleries::DIALOG_GALLERY_ADDED);
45046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // If the user added a gallery then unchecked it, forget about it.
45146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!iter->second.selected)
45246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      continue;
45346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const MediaGalleryPrefInfo& gallery = iter->second.pref_info;
45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId id = preferences_->AddGallery(
45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gallery.device_id, gallery.path, MediaGalleryPrefInfo::kUserAdded,
45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gallery.volume_label, gallery.vendor_name, gallery.model_name,
45846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gallery.total_size_in_bytes, gallery.last_attach_time, 0, 0, 0);
45946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    preferences_->SetGalleryPermissionForExtension(*extension_, id, true);
46046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
46146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
46246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
46346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::UpdateGalleriesOnPreferencesEvent() {
46446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Merge in the permissions from |preferences_|. Afterwards,
46546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // |known_galleries_| may contain galleries that no longer belong there,
46646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // but the code below will put |known_galleries_| back in a consistent state.
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  InitializePermissions();
46846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
46946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::set<GalleryDialogId> new_galleries_to_remove;
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Look for duplicate entries in |new_galleries_| in case one was added
47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // in another dialog.
47246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GalleryPermissionsMap::iterator it = known_galleries_.begin();
47346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       it != known_galleries_.end();
47446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ++it) {
47546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Entry& gallery = it->second;
47646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (GalleryPermissionsMap::iterator new_it = new_galleries_.begin();
47746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         new_it != new_galleries_.end();
47846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         ++new_it) {
47946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (new_it->second.pref_info.path == gallery.pref_info.path &&
48046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          new_it->second.pref_info.device_id == gallery.pref_info.device_id) {
48146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        // Found duplicate entry. Get the existing permission from it and then
48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        // remove it.
48346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gallery.selected = new_it->second.selected;
48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new_galleries_to_remove.insert(new_it->first);
48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        break;
48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      }
48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (std::set<GalleryDialogId>::const_iterator it =
49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)           new_galleries_to_remove.begin();
49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       it != new_galleries_to_remove.end();
49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ++it) {
49346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    new_galleries_.erase(*it);
49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  dialog_->UpdateGalleries();
49746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
49846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::UpdateGalleriesOnDeviceEvent(
50046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& device_id) {
50146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  dialog_->UpdateGalleries();
50246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ui::MenuModel* MediaGalleriesPermissionController::GetContextMenu(
50546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GalleryDialogId gallery_id) {
50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  context_menu_->set_pref_id(gallery_id);
50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return context_menu_.get();
50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GalleryDialogId MediaGalleriesPermissionController::GetDialogId(
51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId pref_id) {
51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return id_map_.GetDialogId(pref_id);
51346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
51546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPermissionController::GetPrefId(
516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GalleryDialogId id) const {
51746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return id_map_.GetPrefId(id);
51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
52046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)Profile* MediaGalleriesPermissionController::GetProfile() {
52146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return Profile::FromBrowserContext(web_contents_->GetBrowserContext());
52246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
52446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::DialogIdMap()
52546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : next_dialog_id_(1) {
52646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Dialog id of 0 is invalid, so fill the slot.
52746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  forward_mapping_.push_back(kInvalidMediaGalleryPrefId);
52846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
52946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
53046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::~DialogIdMap() {
53146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GalleryDialogId
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::GetDialogId(
53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId pref_id) {
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::map<GalleryDialogId, MediaGalleryPrefId>::const_iterator it =
53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      back_map_.find(pref_id);
53846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (it != back_map_.end())
53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return it->second;
54046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
54146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GalleryDialogId result = next_dialog_id_++;
54246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_EQ(result, forward_mapping_.size());
54346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  forward_mapping_.push_back(pref_id);
54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (pref_id != kInvalidMediaGalleryPrefId)
54546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    back_map_[pref_id] = result;
54646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return result;
54746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleryPrefId
55046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::GetPrefId(
551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GalleryDialogId id) const {
55246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_LT(id, next_dialog_id_);
55346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return forward_mapping_[id];
55446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
55546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
55646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// MediaGalleries dialog -------------------------------------------------------
55746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
55846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesDialog::~MediaGalleriesDialog() {}
559