diff options
author | tommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-11 21:42:55 +0000 |
---|---|---|
committer | tommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-11 21:42:55 +0000 |
commit | c138296a8ff077a3aba17588abd18fed9bd7fba2 (patch) | |
tree | 92af52e76ca3fc03ea64ae95513b2ec6a8db62a4 /chrome | |
parent | 2cdd2a0ffdc7a530e2d5ca8fb00e202cf4796ab5 (diff) | |
download | chromium_src-c138296a8ff077a3aba17588abd18fed9bd7fba2.zip chromium_src-c138296a8ff077a3aba17588abd18fed9bd7fba2.tar.gz chromium_src-c138296a8ff077a3aba17588abd18fed9bd7fba2.tar.bz2 |
Media Galleries API Scanning: Give cached scan results if no user gesture.
BUG=161119
Review URL: https://codereview.chromium.org/141203004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@250517 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
8 files changed, 74 insertions, 18 deletions
diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc b/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc index bc56c96..73ea1c9 100644 --- a/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc +++ b/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc @@ -657,7 +657,7 @@ void MediaGalleriesStartMediaScanFunction::OnPreferencesInit() { return; } - media_scan_manager()->StartScan(GetProfile(), GetExtension()->id()); + media_scan_manager()->StartScan(GetProfile(), GetExtension(), user_gesture()); SendResponse(true); } @@ -678,7 +678,7 @@ bool MediaGalleriesCancelMediaScanFunction::RunImpl() { void MediaGalleriesCancelMediaScanFunction::OnPreferencesInit() { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - media_scan_manager()->CancelScan(GetProfile(), GetExtension()->id()); + media_scan_manager()->CancelScan(GetProfile(), GetExtension()); SendResponse(true); } diff --git a/chrome/browser/media_galleries/media_galleries_preferences.cc b/chrome/browser/media_galleries/media_galleries_preferences.cc index 741d0a2..006fee9 100644 --- a/chrome/browser/media_galleries/media_galleries_preferences.cc +++ b/chrome/browser/media_galleries/media_galleries_preferences.cc @@ -1088,6 +1088,18 @@ const MediaGalleriesPrefInfoMap& MediaGalleriesPreferences::known_galleries() return known_galleries_; } +base::Time MediaGalleriesPreferences::GetLastScanCompletionTime() const { + int64 last_scan_time_internal = + profile_->GetPrefs()->GetInt64(prefs::kMediaGalleriesLastScanTime); + return base::Time::FromInternalValue(last_scan_time_internal); +} + +void MediaGalleriesPreferences::SetLastScanCompletionTime( + const base::Time& time) { + profile_->GetPrefs()->SetInt64(prefs::kMediaGalleriesLastScanTime, + time.ToInternalValue()); +} + void MediaGalleriesPreferences::Shutdown() { weak_factory_.InvalidateWeakPtrs(); profile_ = NULL; @@ -1109,6 +1121,10 @@ void MediaGalleriesPreferences::RegisterProfilePrefs( prefs::kMediaGalleriesUniqueId, kInvalidMediaGalleryPrefId + 1, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); + registry->RegisterInt64Pref( + prefs::kMediaGalleriesLastScanTime, + base::Time().ToInternalValue(), + user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); } bool MediaGalleriesPreferences::SetGalleryPermissionInPrefs( diff --git a/chrome/browser/media_galleries/media_galleries_preferences.h b/chrome/browser/media_galleries/media_galleries_preferences.h index 9b3be73..f868aa3 100644 --- a/chrome/browser/media_galleries/media_galleries_preferences.h +++ b/chrome/browser/media_galleries/media_galleries_preferences.h @@ -248,6 +248,11 @@ class MediaGalleriesPreferences : public BrowserContextKeyedService, const MediaGalleriesPrefInfoMap& known_galleries() const; + // These keep track of when we last successfully completed a media scan. + // This is used to provide cached results when appropriate. + base::Time GetLastScanCompletionTime() const; + void SetLastScanCompletionTime(const base::Time& time); + // BrowserContextKeyedService implementation: virtual void Shutdown() OVERRIDE; diff --git a/chrome/browser/media_galleries/media_scan_manager.cc b/chrome/browser/media_galleries/media_scan_manager.cc index 5aebe16..338fe00 100644 --- a/chrome/browser/media_galleries/media_scan_manager.cc +++ b/chrome/browser/media_galleries/media_scan_manager.cc @@ -7,6 +7,7 @@ #include "base/file_util.h" #include "base/files/file_enumerator.h" #include "base/logging.h" +#include "base/time/time.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/media_galleries/media_galleries_preferences.h" @@ -32,6 +33,9 @@ typedef std::set<std::string /*extension id*/> ScanningExtensionIdSet; // directories in the parent directory must be scan results. const int kContainerDirectoryMinimumPercent = 80; +// How long after a completed media scan can we provide the cached results. +const int kScanResultsExpiryTimeInHours = 24; + struct LocationInfo { LocationInfo() : pref_id(kInvalidMediaGalleryPrefId), @@ -307,19 +311,39 @@ void MediaScanManager::CancelScansForProfile(Profile* profile) { } void MediaScanManager::StartScan(Profile* profile, - const std::string& extension_id) { + const extensions::Extension* extension, + bool user_gesture) { + DCHECK(extension); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); ScanObserverMap::iterator scans_for_profile = observers_.find(profile); // We expect that an MediaScanManagerObserver has already been registered. DCHECK(scans_for_profile != observers_.end()); - bool start_scan = !ScanInProgress(); + bool scan_in_progress = ScanInProgress(); // Ignore requests for extensions that are already scanning. ScanningExtensionIdSet* scanning_extensions; scanning_extensions = &scans_for_profile->second.scanning_extensions; - if (!start_scan && ContainsKey(*scanning_extensions, extension_id)) + if (scan_in_progress && ContainsKey(*scanning_extensions, extension->id())) return; + // Provide cached result if there is not already a scan in progress, + // there is no user gesture, and the previous results are unexpired. + MediaGalleriesPreferences* preferences = + MediaGalleriesPreferencesFactory::GetForProfile(profile); + base::TimeDelta time_since_last_scan = + base::Time::Now() - preferences->GetLastScanCompletionTime(); + if (!scan_in_progress && !user_gesture && time_since_last_scan < + base::TimeDelta::FromHours(kScanResultsExpiryTimeInHours)) { + MediaGalleryScanResult file_counts; + int gallery_count = + CountScanResultsForExtension(preferences, extension, &file_counts); + scans_for_profile->second.observer->OnScanStarted(extension->id()); + scans_for_profile->second.observer->OnScanFinished(extension->id(), + gallery_count, + file_counts); + return; + } + // On first scan for the |profile|, register to listen for extension unload. if (scanning_extensions->empty()) { registrar_.Add( @@ -328,8 +352,8 @@ void MediaScanManager::StartScan(Profile* profile, content::Source<Profile>(profile)); } - scanning_extensions->insert(extension_id); - scans_for_profile->second.observer->OnScanStarted(extension_id); + scanning_extensions->insert(extension->id()); + scans_for_profile->second.observer->OnScanStarted(extension->id()); if (folder_finder_) return; @@ -346,17 +370,17 @@ void MediaScanManager::StartScan(Profile* profile, } void MediaScanManager::CancelScan(Profile* profile, - const std::string& extension_id) { + const extensions::Extension* extension) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); // Erases the logical scan if found, early exit otherwise. ScanObserverMap::iterator scans_for_profile = observers_.find(profile); if (scans_for_profile == observers_.end() || - !scans_for_profile->second.scanning_extensions.erase(extension_id)) { + !scans_for_profile->second.scanning_extensions.erase(extension->id())) { return; } - scans_for_profile->second.observer->OnScanCancelled(extension_id); + scans_for_profile->second.observer->OnScanCancelled(extension->id()); // No more scanning extensions for |profile|, so stop listening for unloads. if (scans_for_profile->second.scanning_extensions.empty()) { @@ -389,7 +413,7 @@ void MediaScanManager::Observe( content::Details<extensions::UnloadedExtensionInfo>( details)->extension); DCHECK(extension); - CancelScan(profile, extension->id()); + CancelScan(profile, extension); break; } default: @@ -437,11 +461,11 @@ void MediaScanManager::OnFoundContainerDirectories( ++scans_for_profile) { if (scans_for_profile->second.scanning_extensions.empty()) continue; + Profile* profile = scans_for_profile->first; MediaGalleriesPreferences* preferences = - MediaGalleriesPreferencesFactory::GetForProfile( - scans_for_profile->first); - ExtensionService* extension_service = extensions::ExtensionSystem::Get( - scans_for_profile->first)->extension_service();; + MediaGalleriesPreferencesFactory::GetForProfile(profile); + ExtensionService* extension_service = + extensions::ExtensionSystem::Get(profile)->extension_service(); if (!extension_service) continue; @@ -465,6 +489,7 @@ void MediaScanManager::OnFoundContainerDirectories( } } scanning_extensions->clear(); + preferences->SetLastScanCompletionTime(base::Time::Now()); } registrar_.RemoveAll(); folder_finder_.reset(); diff --git a/chrome/browser/media_galleries/media_scan_manager.h b/chrome/browser/media_galleries/media_scan_manager.h index 8a60403..a04e7ea 100644 --- a/chrome/browser/media_galleries/media_scan_manager.h +++ b/chrome/browser/media_galleries/media_scan_manager.h @@ -21,6 +21,10 @@ class Profile; class MediaScanManagerObserver; +namespace extensions { +class Extension; +} // namespace extensions + // The MediaScanManager is owned by MediaFileSystemRegistry, which is global. // This class manages multiple 'virtual' media scans, up to one per extension // per profile, and also manages the one physical scan backing them. @@ -41,8 +45,9 @@ class MediaScanManager : public content::NotificationObserver { // The results of the scan are reported to the registered // MediaScanManagerObserver via OnScanFinished. There must be an observer // registered for |profile| before the scan starts. - void StartScan(Profile* profile, const std::string& extension_id); - void CancelScan(Profile* profile, const std::string& extension_id); + void StartScan(Profile* profile, const extensions::Extension* extension, + bool user_gesture); + void CancelScan(Profile* profile, const extensions::Extension* extension); protected: friend class MediaGalleriesPlatformAppBrowserTest; diff --git a/chrome/browser/media_galleries/media_scan_manager_unittest.cc b/chrome/browser/media_galleries/media_scan_manager_unittest.cc index a64b265..6d23369 100644 --- a/chrome/browser/media_galleries/media_scan_manager_unittest.cc +++ b/chrome/browser/media_galleries/media_scan_manager_unittest.cc @@ -190,7 +190,8 @@ class MediaScanManagerTest : public MediaScanManagerObserver, } void StartScan() { - media_scan_manager_->StartScan(profile_.get(), extension_->id()); + media_scan_manager_->StartScan(profile_.get(), extension_, + true /* user_gesture */); } MediaGalleriesPreferences* gallery_prefs() { diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 8290853..af9398c 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -2431,6 +2431,9 @@ const char kMediaGalleriesUniqueId[] = "media_galleries.gallery_id"; const char kMediaGalleriesRememberedGalleries[] = "media_galleries.remembered_galleries"; +// The last time a media scan completed. +const char kMediaGalleriesLastScanTime[] = "media_galleries.last_scan_time"; + #if defined(USE_ASH) // |kShelfAlignment| and |kShelfAutoHideBehavior| have a local variant. The // local variant is not synced and is used if set. If the local variant is not diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 39b59b2..06bbaca 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -836,6 +836,7 @@ extern const char kComponentUpdaterState[]; extern const char kMediaGalleriesUniqueId[]; extern const char kMediaGalleriesRememberedGalleries[]; +extern const char kMediaGalleriesLastScanTime[]; #if defined(USE_ASH) extern const char kShelfAlignment[]; |