15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_scan_result_controller.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <list>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/metrics/histogram.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/stl_util.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/browser_process.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_histograms.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/media_gallery_context_menu.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/platform_util.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_info.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_monitor.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension.h"
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/common/permissions/media_galleries_permission.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using storage_monitor::StorageInfo;
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using storage_monitor::StorageMonitor;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Comparator for sorting Entries -- more files first and then sorts by
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// absolute path.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ScanResultsComparator(
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const MediaGalleriesDialogController::Entry& a,
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const MediaGalleriesDialogController::Entry& b) {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int a_media_count = a.pref_info.audio_count + a.pref_info.image_count +
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      a.pref_info.video_count;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int b_media_count = b.pref_info.audio_count + b.pref_info.image_count +
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      b.pref_info.video_count;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (a_media_count == b_media_count)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return a.pref_info.AbsolutePath() < b.pref_info.AbsolutePath();
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return a_media_count > b_media_count;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)size_t MediaGalleriesScanResultController::ScanResultCountForExtension(
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* preferences,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::Extension* extension) {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScanResults scan_results;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateScanResultsFromPreferences(preferences, extension,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   MediaGalleryPrefIdSet(), &scan_results);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scan_results.size();
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesScanResultController::MediaGalleriesScanResultController(
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::WebContents* web_contents,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::Extension& extension,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Closure& on_finish)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : web_contents_(web_contents),
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        extension_(&extension),
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        on_finish_(on_finish),
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        create_dialog_callback_(base::Bind(&MediaGalleriesDialog::Create)) {
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  preferences_ =
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          GetProfile());
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Passing unretained pointer is safe, since the dialog controller
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is self-deleting, and so won't be deleted until it can be shown
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and then closed.
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  preferences_->EnsureInitialized(base::Bind(
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        &MediaGalleriesScanResultController::OnPreferencesInitialized,
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Unretained(this)));
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Unretained is safe because |this| owns |context_menu_|.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_menu_.reset(new MediaGalleryContextMenu(base::Bind(
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          &MediaGalleriesScanResultController::DidForgetEntry,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Unretained(this))));
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesScanResultController::MediaGalleriesScanResultController(
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::Extension& extension,
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* preferences,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const CreateDialogCallback& create_dialog_callback,
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Closure& on_finish)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : web_contents_(NULL),
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extension_(&extension),
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      on_finish_(on_finish),
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      preferences_(preferences),
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      create_dialog_callback_(create_dialog_callback) {
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnPreferencesInitialized();
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesScanResultController::~MediaGalleriesScanResultController() {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |preferences_| may be NULL in tests.
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (preferences_)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    preferences_->RemoveGalleryChangeObserver(this);
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (StorageMonitor::GetInstance())
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StorageMonitor::GetInstance()->RemoveObserver(this);
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesScanResultController::GetHeader() const {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return l10n_util::GetStringFUTF16(
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IDS_MEDIA_GALLERIES_SCAN_RESULT_DIALOG_HEADER,
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF8ToUTF16(extension_->name()));
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesScanResultController::GetSubtext() const {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::MediaGalleriesPermission::CheckParam copy_to_param(
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extensions::MediaGalleriesPermission::kCopyToPermission);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::MediaGalleriesPermission::CheckParam delete_param(
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extensions::MediaGalleriesPermission::kDeletePermission);
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const extensions::PermissionsData* permissions_data =
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_->permissions_data();
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool has_copy_to_permission = permissions_data->CheckAPIPermissionWithParam(
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::APIPermission::kMediaGalleries, &copy_to_param);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool has_delete_permission = permissions_data->CheckAPIPermissionWithParam(
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::APIPermission::kMediaGalleries, &delete_param);
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int id;
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (has_copy_to_permission)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    id = IDS_MEDIA_GALLERIES_SCAN_RESULT_DIALOG_SUBTEXT_READ_WRITE;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else if (has_delete_permission)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    id = IDS_MEDIA_GALLERIES_SCAN_RESULT_DIALOG_SUBTEXT_READ_DELETE;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    id = IDS_MEDIA_GALLERIES_SCAN_RESULT_DIALOG_SUBTEXT_READ_ONLY;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return l10n_util::GetStringFUTF16(id, base::UTF8ToUTF16(extension_->name()));
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaGalleriesScanResultController::IsAcceptAllowed() const {
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return true;
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaGalleriesScanResultController::ShouldShowFolderViewer(
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const Entry& entry) const {
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return entry.pref_info.IsGalleryAvailable();
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::vector<base::string16>
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesScanResultController::GetSectionHeaders() const {
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<base::string16> result;
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  result.push_back(base::string16());
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return result;
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesDialogController::Entries
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesScanResultController::GetSectionEntries(
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    size_t index) const {
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_EQ(0U, index);
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Entries result;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  result.reserve(scan_results_.size());
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (ScanResults::const_iterator it = scan_results_.begin();
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != scan_results_.end();
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result.push_back(it->second);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::sort(result.begin(), result.end(), ScanResultsComparator);
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result;
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesScanResultController::GetAuxiliaryButtonText() const {
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return base::string16();
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::DidClickAuxiliaryButton() {
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NOTREACHED();
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::DidToggleEntry(
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId pref_id, bool selected) {
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(ContainsKey(scan_results_, pref_id));
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScanResults::iterator entry = scan_results_.find(pref_id);
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry->second.selected = selected;
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::DidClickOpenFolderViewer(
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefId pref_id) {
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScanResults::const_iterator entry = scan_results_.find(pref_id);
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (entry == scan_results_.end()) {
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED();
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  platform_util::OpenItem(GetProfile(), entry->second.pref_info.AbsolutePath());
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::DidForgetEntry(
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId pref_id) {
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  media_galleries::UsageCount(media_galleries::ADD_SCAN_RESULTS_FORGET_GALLERY);
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  results_to_remove_.insert(pref_id);
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scan_results_.erase(pref_id);
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  dialog_->UpdateGalleries();
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesScanResultController::GetAcceptButtonText() const {
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return l10n_util::GetStringUTF16(
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      IDS_MEDIA_GALLERIES_SCAN_RESULT_DIALOG_CONFIRM);
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::DialogFinished(bool accepted) {
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // No longer interested in preference updates (and the below code generates
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // some).
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |preferences_| may be NULL in tests.
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (preferences_)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    preferences_->RemoveGalleryChangeObserver(this);
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (accepted) {
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(preferences_);
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    media_galleries::UsageCount(media_galleries::ADD_SCAN_RESULTS_ACCEPTED);
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int granted = 0;
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int total = 0;
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (ScanResults::const_iterator it = scan_results_.begin();
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         it != scan_results_.end();
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         ++it) {
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (it->second.selected) {
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        bool changed = preferences_->SetGalleryPermissionForExtension(
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              *extension_, it->first, true);
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        DCHECK(changed);
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        granted++;
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      total++;
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (total > 0) {
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      UMA_HISTOGRAM_PERCENTAGE("MediaGalleries.ScanGalleriesGranted",
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               (granted * 100 / total));
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (MediaGalleryPrefIdSet::const_iterator it = results_to_remove_.begin();
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        it != results_to_remove_.end();
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ++it) {
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      preferences_->ForgetGalleryById(*it);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    media_galleries::UsageCount(media_galleries::ADD_SCAN_RESULTS_CANCELLED);
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  on_finish_.Run();
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete this;
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ui::MenuModel* MediaGalleriesScanResultController::GetContextMenu(
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId id) {
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_menu_->set_pref_id(id);
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return context_menu_.get();
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)content::WebContents* MediaGalleriesScanResultController::WebContents() {
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return web_contents_;
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::UpdateScanResultsFromPreferences(
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* preferences,
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::Extension* extension,
25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleryPrefIdSet ignore_list,
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ScanResults* scan_results) {
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(preferences->IsInitialized());
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const MediaGalleriesPrefInfoMap& galleries = preferences->known_galleries();
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefIdSet permitted =
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      preferences->GalleriesForExtension(*extension);
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add or update any scan results that the extension doesn't already have
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // access to or isn't in |ignore_list|.
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != galleries.end();
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const MediaGalleryPrefInfo& gallery = it->second;
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if ((gallery.audio_count || gallery.image_count || gallery.video_count) &&
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !gallery.IsBlackListedType() &&
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !ContainsKey(permitted, gallery.pref_id) &&
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !ContainsKey(ignore_list, gallery.pref_id)) {
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScanResults::iterator existing = scan_results->find(gallery.pref_id);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (existing == scan_results->end()) {
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Default to selected.
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        (*scan_results)[gallery.pref_id] = Entry(gallery, true);
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      } else {
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Update pref_info, in case anything has been updated.
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        existing->second.pref_info = gallery;
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove anything from |scan_results| that's no longer valid or the user
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // already has access to.
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::list<ScanResults::iterator> to_remove;
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (ScanResults::iterator it = scan_results->begin();
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != scan_results->end();
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPrefInfoMap::const_iterator pref_gallery =
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        galleries.find(it->first);
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (pref_gallery == galleries.end() ||
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pref_gallery->second.IsBlackListedType() ||
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ContainsKey(permitted, it->first)) {
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      to_remove.push_back(it);
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (!to_remove.empty()) {
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scan_results->erase(to_remove.front());
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    to_remove.pop_front();
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnPreferencesInitialized() {
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // These may be NULL in tests.
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (StorageMonitor::GetInstance())
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StorageMonitor::GetInstance()->AddObserver(this);
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (preferences_) {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    preferences_->AddGalleryChangeObserver(this);
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UpdateScanResultsFromPreferences(preferences_, extension_,
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     results_to_remove_, &scan_results_);
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  dialog_.reset(create_dialog_callback_.Run(this));
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnPreferenceUpdate(
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& extension_id) {
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (extension_id == extension_->id()) {
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UpdateScanResultsFromPreferences(preferences_, extension_,
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     results_to_remove_, &scan_results_);
32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    dialog_->UpdateGalleries();
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnRemovableDeviceUpdate(
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string device_id) {
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (ScanResults::const_iterator it = scan_results_.begin();
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != scan_results_.end();
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++it) {
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (it->second.pref_info.device_id == device_id) {
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      dialog_->UpdateGalleries();
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)Profile* MediaGalleriesScanResultController::GetProfile() const {
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents_->GetBrowserContext());
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnRemovableStorageAttached(
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const StorageInfo& info) {
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnRemovableDeviceUpdate(info.device_id());
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnRemovableStorageDetached(
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const StorageInfo& info) {
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnRemovableDeviceUpdate(info.device_id());
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnPermissionAdded(
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* /*pref*/,
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& extension_id,
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId /*pref_id*/) {
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnPreferenceUpdate(extension_id);
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnPermissionRemoved(
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* /*pref*/,
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& extension_id,
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId /*pref_id*/) {
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnPreferenceUpdate(extension_id);
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnGalleryAdded(
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* /*prefs*/,
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId /*pref_id*/) {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnPreferenceUpdate(extension_->id());
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnGalleryRemoved(
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* /*prefs*/,
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId /*pref_id*/) {
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnPreferenceUpdate(extension_->id());
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesScanResultController::OnGalleryInfoUpdated(
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleriesPreferences* /*prefs*/,
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefId /*pref_id*/) {
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnPreferenceUpdate(extension_->id());
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
386