| Index: chrome/browser/chromeos/customization_document.cc
|
| diff --git a/chrome/browser/chromeos/customization_document.cc b/chrome/browser/chromeos/customization_document.cc
|
| index 99d7d82bff3edf4999734377bcece14d89c73016..904be2ecc9744b6626a9f71349851d3b139eb7b1 100644
|
| --- a/chrome/browser/chromeos/customization_document.cc
|
| +++ b/chrome/browser/chromeos/customization_document.cc
|
| @@ -12,6 +12,7 @@
|
| #include "base/logging.h"
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/path_service.h"
|
| #include "base/prefs/pref_registry_simple.h"
|
| #include "base/prefs/pref_service.h"
|
| #include "base/strings/string_split.h"
|
| @@ -20,6 +21,8 @@
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/time/time.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/chromeos/customization_wallpaper_downloader.h"
|
| +#include "chrome/browser/chromeos/login/wallpaper_manager.h"
|
| #include "chrome/browser/chromeos/login/wizard_controller.h"
|
| #include "chrome/browser/chromeos/net/delay_network_call.h"
|
| #include "chrome/browser/extensions/external_loader.h"
|
| @@ -27,7 +30,9 @@
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/ui/app_list/app_list_syncable_service.h"
|
| #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
|
| +#include "chrome/common/chrome_paths.h"
|
| #include "chrome/common/extensions/extension_constants.h"
|
| +#include "chrome/common/pref_names.h"
|
| #include "chromeos/network/network_state.h"
|
| #include "chromeos/network/network_state_handler.h"
|
| #include "chromeos/system/statistics_provider.h"
|
| @@ -64,6 +69,14 @@ const char kAcceptedManifestVersion[] = "1.0";
|
| const char kStartupCustomizationManifestPath[] =
|
| "/opt/oem/etc/startup_manifest.json";
|
|
|
| +// THis is subdirectory relative to PathService(DIR_CHROMEOS_CUSTOM_WALLPAPERS),
|
| +// where downloaded (and resized) wallpaper is stored.
|
| +const char kCustomizationDefaultWallpaperDir[] = "customization";
|
| +
|
| +// The original downloaded image file is stored under this name.
|
| +const char kCustomizationDefaultWallpaperDownloadedFile[] =
|
| + "default.downloaded";
|
| +
|
| // Name of local state option that tracks if services customization has been
|
| // applied.
|
| const char kServicesCustomizationAppliedPref[] = "ServicesCustomizationApplied";
|
| @@ -123,6 +136,12 @@ std::string GetLocaleSpecificStringImpl(
|
| return std::string();
|
| }
|
|
|
| +void CheckWallpaperCacheExists(const base::FilePath& path, bool* exists) {
|
| + DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
|
| + DCHECK(exists);
|
| + *exists = base::PathExists(path);
|
| +}
|
| +
|
| } // anonymous namespace
|
|
|
| namespace chromeos {
|
| @@ -356,6 +375,7 @@ ServicesCustomizationDocument* ServicesCustomizationDocument::GetInstance() {
|
| void ServicesCustomizationDocument::RegisterPrefs(
|
| PrefRegistrySimple* registry) {
|
| registry->RegisterBooleanPref(kServicesCustomizationAppliedPref, false);
|
| + registry->RegisterStringPref(prefs::kCustomizationDefaultWallpaperURL, "");
|
| }
|
|
|
| // static
|
| @@ -517,7 +537,7 @@ void ServicesCustomizationDocument::OnURLFetchComplete(
|
| }
|
|
|
| bool ServicesCustomizationDocument::ApplyOOBECustomization() {
|
| - // TODO(dpolukhin): apply default wallpaper, crbug.com/348136.
|
| + CheckAndApplyWallpaper();
|
| SetApplied(true);
|
| return true;
|
| }
|
| @@ -562,6 +582,46 @@ std::string ServicesCustomizationDocument::GetOemAppsFolderName(
|
| return GetOemAppsFolderNameImpl(locale, *root_);
|
| }
|
|
|
| +// static
|
| +base::FilePath ServicesCustomizationDocument::GetCustomizedWallpaperCacheDir() {
|
| + base::FilePath custom_wallpaper_dir;
|
| + const bool success = PathService::Get(chrome::DIR_CHROMEOS_CUSTOM_WALLPAPERS,
|
| + &custom_wallpaper_dir);
|
| + DCHECK(success);
|
| +
|
| + if (success)
|
| + return custom_wallpaper_dir.Append(kCustomizationDefaultWallpaperDir);
|
| +
|
| + return custom_wallpaper_dir;
|
| +}
|
| +
|
| +// static
|
| +base::FilePath
|
| +ServicesCustomizationDocument::GetCustomizedWallpaperDownloadedFileName() {
|
| + const base::FilePath dir = GetCustomizedWallpaperCacheDir();
|
| + if (dir.empty())
|
| + return dir;
|
| + return dir.Append(kCustomizationDefaultWallpaperDownloadedFile);
|
| +}
|
| +
|
| +// static
|
| +void ServicesCustomizationDocument::OnCustomizedWallpaperDownloaded(
|
| + const GURL& wallpaper_url) {
|
| + DCHECK(wallpaper_url.is_valid());
|
| +
|
| + VLOG(1) << "Setting default wallpaper to '"
|
| + << GetCustomizedWallpaperDownloadedFileName().value() << "' ('"
|
| + << wallpaper_url.spec() << "')";
|
| + WallpaperManager::Get()->SetCustomizedDefaultWallpaper(
|
| + wallpaper_url,
|
| + GetCustomizedWallpaperDownloadedFileName(),
|
| + GetCustomizedWallpaperCacheDir());
|
| +}
|
| +
|
| +void ServicesCustomizationDocument::DestroyWallpaperDownloader() {
|
| + wallpaper_downloader_.reset();
|
| +}
|
| +
|
| scoped_ptr<base::DictionaryValue>
|
| ServicesCustomizationDocument::GetDefaultAppsInProviderFormat(
|
| const base::DictionaryValue& root) {
|
| @@ -647,4 +707,87 @@ std::string ServicesCustomizationDocument::GetOemAppsFolderNameImpl(
|
| &root, locale, kLocalizedContent, kDefaultAppsFolderName);
|
| }
|
|
|
| +void ServicesCustomizationDocument::StartOEMWallpaperDownload(
|
| + const GURL& wallpaper_url) {
|
| + DCHECK(wallpaper_url.is_valid());
|
| +
|
| + const base::FilePath dir = GetCustomizedWallpaperCacheDir();
|
| + const base::FilePath file = GetCustomizedWallpaperDownloadedFileName();
|
| + if (!dir.empty() && !file.empty()) {
|
| + wallpaper_downloader_.reset(new CustomizationWallpaperDownloader(
|
| + g_browser_process->system_request_context(), wallpaper_url, dir, file));
|
| +
|
| + wallpaper_downloader_->Start();
|
| + }
|
| +}
|
| +
|
| +void ServicesCustomizationDocument::CheckAndApplyWallpaper() {
|
| + if (wallpaper_downloader_.get()) {
|
| + VLOG(1) << "CheckAndApplyWallpaper(): download has already started.";
|
| + return;
|
| + }
|
| + GURL wallpaper_url = GetDefaultWallpaperUrl();
|
| + // Should fail if this ever happens in tests.
|
| + DCHECK(wallpaper_url.is_valid() || wallpaper_url.is_empty());
|
| + if (!wallpaper_url.is_valid()) {
|
| + if (!wallpaper_url.is_empty()) {
|
| + LOG(WARNING) << "Invalid Customized Wallpaper URL.";
|
| + }
|
| + return;
|
| + }
|
| + scoped_ptr<bool> exists(new bool(false));
|
| +
|
| + base::Closure check_file_exists =
|
| + base::Bind(&CheckWallpaperCacheExists,
|
| + GetCustomizedWallpaperDownloadedFileName(),
|
| + base::Unretained(exists.get()));
|
| + base::Closure on_checked_closure =
|
| + base::Bind(&ServicesCustomizationDocument::OnCheckedWallpaperCacheExists,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(exists.Pass()));
|
| + if (!content::BrowserThread::PostBlockingPoolTaskAndReply(
|
| + FROM_HERE, check_file_exists, on_checked_closure)) {
|
| + LOG(WARNING) << "Failed to start check Wallpaper cache exists.";
|
| + }
|
| +}
|
| +
|
| +void ServicesCustomizationDocument::OnCheckedWallpaperCacheExists(
|
| + scoped_ptr<bool> exists) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| + DCHECK(exists.get());
|
| +
|
| + ApplyWallpaper(*exists);
|
| +}
|
| +
|
| +void ServicesCustomizationDocument::ApplyWallpaper(
|
| + bool default_wallpaper_file_exists) {
|
| + GURL wallpaper_url = GetDefaultWallpaperUrl();
|
| + DCHECK(wallpaper_url.is_valid());
|
| +
|
| + PrefService* pref_service = g_browser_process->local_state();
|
| +
|
| + std::string current_url =
|
| + pref_service->GetString(prefs::kCustomizationDefaultWallpaperURL);
|
| + if (current_url != wallpaper_url.spec()) {
|
| + VLOG(1) << "ServicesCustomizationDocument::ApplyWallpaper() : "
|
| + << "Wallpaper URL in customization document '"
|
| + << wallpaper_url.spec() << "' differs from current '" << current_url
|
| + << "'."
|
| + << (GURL(current_url).is_valid() && default_wallpaper_file_exists
|
| + ? " Ignored."
|
| + : " Will refetch.");
|
| + }
|
| + // Never update system-wide wallpaper (i.e. do not check
|
| + // current_url == wallpaper_url.spec() )
|
| + if (GURL(current_url).is_valid() && default_wallpaper_file_exists) {
|
| + VLOG(1)
|
| + << "ServicesCustomizationDocument::ApplyWallpaper() : reuse existing";
|
| + OnCustomizedWallpaperDownloaded(GURL(current_url));
|
| + } else {
|
| + VLOG(1)
|
| + << "ServicesCustomizationDocument::ApplyWallpaper() : start download";
|
| + StartOEMWallpaperDownload(wallpaper_url);
|
| + }
|
| +}
|
| +
|
| } // namespace chromeos
|
|
|