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, ©_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