wallpaper_private_api.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/wallpaper_private_api.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/ash_switches.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/wm/mru_window_tracker.h"
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/command_line.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_image.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/wallpaper_manager.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/app_locale_settings.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/platform_locale_settings.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::BinaryValue;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace wallpaper_private = extensions::api::wallpaper_private;
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper_if_exists = wallpaper_private::SetWallpaperIfExists;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper = wallpaper_private::SetWallpaper;
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper = wallpaper_private::SetCustomWallpaper;
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper_layout =
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    wallpaper_private::SetCustomWallpaperLayout;
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_thumbnail = wallpaper_private::GetThumbnail;
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace save_thumbnail = wallpaper_private::SaveThumbnail;
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_offline_wallpaper_list =
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    wallpaper_private::GetOfflineWallpaperList;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kWallpaperManifestBaseURL[] = "https://commondatastorage.googleapis."
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "com/chromeos-wallpaper-public/manifest_";
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool IsOEMDefaultWallpaper() {
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return CommandLine::ForCurrentProcess()->
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      HasSwitch(ash::switches::kAshOemWallpaperSmall);
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Saves |data| as |file_name| to directory with |key|. Return false if the
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// directory can not be found/created or failed to write file.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveData(int key, const std::string& file_name, const std::string& data) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_dir;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(PathService::Get(key, &data_dir));
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::DirectoryExists(data_dir) &&
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !file_util::CreateDirectory(data_dir)) {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path = data_dir.Append(file_name);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return base::PathExists(file_path) ||
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         (file_util::WriteFile(file_path, data.c_str(),
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               data.size()) != -1);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Gets |file_name| from directory with |key|. Return false if the directory can
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not be found or failed to read file to string |data|. Note if the |file_name|
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// can not be found in the directory, return true with empty |data|. It is
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// expected that we may try to access file which did not saved yet.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetData(const base::FilePath& path, std::string* data) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_dir = path.DirName();
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::DirectoryExists(data_dir) &&
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !file_util::CreateDirectory(data_dir))
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return !base::PathExists(path) ||
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         base::ReadFileToString(path, data);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowStateManager;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowStateManager* g_window_state_manager = NULL;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowStateManager remembers which windows have been minimized in order to
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// restore them when the wallpaper viewer is hidden.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowStateManager : public aura::WindowObserver {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Minimizes all windows except the active window.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void MinimizeInactiveWindows() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (g_window_state_manager)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete g_window_state_manager;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_window_state_manager = new WindowStateManager();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_window_state_manager->BuildWindowListAndMinimizeInactive(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::wm::GetActiveWindow());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activates all minimized windows restoring them to their previous state.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should only be called after calling MinimizeInactiveWindows.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RestoreWindows() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(g_window_state_manager);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_window_state_manager->RestoreMinimizedWindows();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete g_window_state_manager;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_window_state_manager = NULL;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowStateManager() {}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WindowStateManager() {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<aura::Window*>::iterator iter = windows_.begin();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != windows_.end(); ++iter) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*iter)->RemoveObserver(this);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BuildWindowListAndMinimizeInactive(aura::Window* active_window) {
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    windows_ = ash::MruWindowTracker::BuildWindowList(false);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Remove active window.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*>::iterator last =
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::remove(windows_.begin(), windows_.end(), active_window);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Removes unfocusable windows.
13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    last = std::remove_if(
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        windows_.begin(),
13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        last,
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        std::ptr_fun(ash::wm::IsWindowMinimized));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows_.erase(last, windows_.end());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<aura::Window*>::iterator iter = windows_.begin();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != windows_.end(); ++iter) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*iter)->AddObserver(this);
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ash::wm::GetWindowState(*iter)->Minimize();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RestoreMinimizedWindows() {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<aura::Window*>::iterator iter = windows_.begin();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != windows_.end(); ++iter) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::wm::ActivateWindow(*iter);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // aura::WindowObserver overrides.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window->RemoveObserver(this);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<aura::Window*>::iterator i = std::find(windows_.begin(),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        windows_.end(), window);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(i != windows_.end());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows_.erase(i);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of minimized windows.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<aura::Window*> windows_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateGetStringsFunction::RunImpl() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetResult(dict);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SET_STRING(id, idr) \
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(id, l10n_util::GetStringUTF16(idr))
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("webFontFamily", IDS_WEB_FONT_FAMILY);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("webFontSize", IDS_WEB_FONT_SIZE);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("allCategoryLabel", IDS_WALLPAPER_MANAGER_ALL_CATEGORY_LABEL);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("deleteCommandLabel", IDS_WALLPAPER_MANAGER_DELETE_COMMAND_LABEL);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("customCategoryLabel",
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_WALLPAPER_MANAGER_CUSTOM_CATEGORY_LABEL);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("selectCustomLabel",
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_WALLPAPER_MANAGER_SELECT_CUSTOM_LABEL);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("positionLabel", IDS_WALLPAPER_MANAGER_POSITION_LABEL);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("colorLabel", IDS_WALLPAPER_MANAGER_COLOR_LABEL);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("centerCroppedLayout",
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_OPTIONS_WALLPAPER_CENTER_CROPPED_LAYOUT);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("centerLayout", IDS_OPTIONS_WALLPAPER_CENTER_LAYOUT);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("stretchLayout", IDS_OPTIONS_WALLPAPER_STRETCH_LAYOUT);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("connectionFailed", IDS_WALLPAPER_MANAGER_ACCESS_FAIL);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("downloadFailed", IDS_WALLPAPER_MANAGER_DOWNLOAD_FAIL);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("downloadCanceled", IDS_WALLPAPER_MANAGER_DOWNLOAD_CANCEL);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("customWallpaperWarning",
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_WALLPAPER_MANAGER_SHOW_CUSTOM_WALLPAPER_ON_START_WARNING);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("accessFileFailure", IDS_WALLPAPER_MANAGER_ACCESS_FILE_FAILURE);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("invalidWallpaper", IDS_WALLPAPER_MANAGER_INVALID_WALLPAPER);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("surpriseMeLabel", IDS_WALLPAPER_MANAGER_SURPRISE_ME_LABEL);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("learnMore", IDS_LEARN_MORE);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SET_STRING
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::SetFontAndTextDirection(dict);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::WallpaperManager::Get();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::WallpaperInfo info;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (wallpaper_manager->GetLoggedInUserWallpaperInfo(&info))
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dict->SetString("currentWallpaper", info.file);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dict->SetString("manifestBaseURL", kWallpaperManifestBaseURL);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  dict->SetBoolean("isOEMDefaultWallpaper", IsOEMDefaultWallpaper());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction::
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateSetWallpaperIfExistsFunction() {}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction::
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSetWallpaperIfExistsFunction() {}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetWallpaperIfExistsFunction::RunImpl() {
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  params = set_wallpaper_if_exists::Params::Create(*args_);
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath wallpaper_path;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fallback_path;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::WallpaperResolution resolution = ash::Shell::GetInstance()->
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      desktop_background_controller()->GetAppropriateResolution();
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string file_name = GURL(params->url).ExtractFileName();
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS,
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                         &wallpaper_path));
2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  fallback_path = wallpaper_path.Append(file_name);
2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (params->layout != wallpaper_private::WALLPAPER_LAYOUT_STRETCH &&
2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      resolution == ash::WALLPAPER_RESOLUTION_SMALL) {
2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    file_name = base::FilePath(file_name).InsertBeforeExtension(
2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        chromeos::kSmallWallpaperSuffix).value();
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  wallpaper_path = wallpaper_path.Append(file_name);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &WallpaperPrivateSetWallpaperIfExistsFunction::
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              ReadFileAndInitiateStartDecode,
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, wallpaper_path, fallback_path));
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReadFileAndInitiateStartDecode(const base::FilePath& file_path,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const base::FilePath& fallback_path) {
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string data;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path = file_path;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::PathExists(file_path))
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    path = fallback_path;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (base::PathExists(path) &&
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::ReadFileToString(path, &data)) {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::StartDecode,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   this, data));
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error = base::StringPrintf(
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Failed to set wallpaper %s from file system.",
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        path.BaseName().value().c_str());
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists,
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 this, error));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnWallpaperDecoded(
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::ImageSkia& wallpaper) {
292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Set unsafe_wallpaper_decoder_ to null since the decoding already finished.
293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsafe_wallpaper_decoder_ = NULL;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wallpaper_manager->SetWallpaperFromImageSkia(wallpaper, layout);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_persistent =
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperInfo info = {
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      params->url,
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layout,
3068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      chromeos::User::ONLINE,
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Time::Now().LocalMidnight()
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(base::Value::CreateBooleanValue(true));
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists(
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& error) {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(base::Value::CreateBooleanValue(false));
318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  OnFailure(error);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::WallpaperPrivateSetWallpaperFunction() {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::~WallpaperPrivateSetWallpaperFunction() {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetWallpaperFunction::RunImpl() {
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  params = set_wallpaper::Params::Create(*args_);
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets email address while at UI thread.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartDecode(params->wallpaper);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::OnWallpaperDecoded(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::ImageSkia& wallpaper) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wallpaper_ = wallpaper;
342d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Set unsafe_wallpaper_decoder_ to null since the decoding already finished.
343d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsafe_wallpaper_decoder_ = NULL;
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::BLOCK_SHUTDOWN);
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSetWallpaperFunction::SaveToFile, this));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SaveToFile() {
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string file_name = GURL(params->url).ExtractFileName();
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (SaveData(chrome::DIR_CHROMEOS_WALLPAPERS, file_name, params->wallpaper)) {
36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    wallpaper_.EnsureRepsForSupportedScales();
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper_.DeepCopy());
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ImageSkia is not RefCountedThreadSafe. Use a deep copied ImageSkia if
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // post to another thread.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper,
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   this, base::Passed(&deep_copy)));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::UserImage wallpaper(wallpaper_);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath wallpaper_dir;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir));
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path = wallpaper_dir.Append(
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        file_name).InsertBeforeExtension(chromeos::kSmallWallpaperSuffix);
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (base::PathExists(file_path))
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Generates and saves small resolution wallpaper. Uses CENTER_CROPPED to
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // maintain the aspect ratio after resize.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::WallpaperManager::Get()->ResizeAndSaveWallpaper(
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wallpaper,
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        file_path,
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::WALLPAPER_LAYOUT_CENTER_CROPPED,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::kSmallWallpaperMaxWidth,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::kSmallWallpaperMaxHeight);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string error = base::StringPrintf(
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Failed to create/write wallpaper to %s.", file_name.c_str());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        base::Bind(&WallpaperPrivateSetWallpaperFunction::OnFailure,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   this, error));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper(
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<gfx::ImageSkia> wallpaper) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::WallpaperManager::Get();
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wallpaper_manager->SetWallpaperFromImageSkia(*wallpaper.get(), layout);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_persistent =
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::WallpaperInfo info = {
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      params->url,
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      layout,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::User::ONLINE,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time::Now().LocalMidnight()
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(email_, info, is_persistent);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendResponse(true);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction::
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateResetWallpaperFunction() {}
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction::
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateResetWallpaperFunction() {}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateResetWallpaperFunction::RunImpl() {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::UserManager* user_manager = chromeos::UserManager::Get();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string email = user_manager->GetLoggedInUser()->email();
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->RemoveUserWallpaperInfo(email);
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperInfo info = {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "",
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::WALLPAPER_LAYOUT_CENTER,
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::User::DEFAULT,
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Time::Now().LocalMidnight()
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_persistent =
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !user_manager->IsCurrentUserNonCryptohomeDataEphemeral();
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->SetDefaultWallpaper();
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction::
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateSetCustomWallpaperFunction() {}
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction::
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSetCustomWallpaperFunction() {}
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperFunction::RunImpl() {
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  params = set_custom_wallpaper::Params::Create(*args_);
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Gets email address and username hash while at UI thread.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email();
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  user_id_hash_ =
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::UserManager::Get()->GetLoggedInUser()->username_hash();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartDecode(params->wallpaper);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::OnWallpaperDecoded(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::ImageSkia& wallpaper) {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  chromeos::UserImage::RawImage raw_image(params->wallpaper.begin(),
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                          params->wallpaper.end());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::UserImage image(wallpaper, raw_image);
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath thumbnail_path = wallpaper_manager->GetCustomWallpaperPath(
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::kThumbnailWallpaperSubDir, user_id_hash_, params->file_name);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::BLOCK_SHUTDOWN);
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wallpaper_manager->SetCustomWallpaper(email_,
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        user_id_hash_,
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        params->file_name,
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        layout,
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos::User::CUSTOMIZED,
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        image);
489d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsafe_wallpaper_decoder_ = NULL;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (params->generate_thumbnail) {
49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    wallpaper.EnsureRepsForSupportedScales();
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper.DeepCopy());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Generates thumbnail before call api function callback. We can then
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // request thumbnail in the javascript callback.
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task_runner->PostTask(FROM_HERE,
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail,
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, thumbnail_path, base::Passed(&deep_copy)));
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(true);
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail(
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& thumbnail_path, scoped_ptr<gfx::ImageSkia> image) {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::UserImage wallpaper(*image.get());
5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::PathExists(thumbnail_path.DirName()))
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_util::CreateDirectory(thumbnail_path.DirName());
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager::Get()->ResizeWallpaper(
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      wallpaper,
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::WALLPAPER_LAYOUT_STRETCH,
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kWallpaperThumbnailWidth,
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::kWallpaperThumbnailHeight,
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &data);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated,
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, data));
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated(
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::RefCountedBytes* data) {
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* result = BinaryValue::CreateWithCopiedBuffer(
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<const char*>(data->front()), data->size());
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(result);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendResponse(true);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction::
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateSetCustomWallpaperLayoutFunction() {}
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction::
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSetCustomWallpaperLayoutFunction() {}
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperLayoutFunction::RunImpl() {
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<set_custom_wallpaper_layout::Params> params(
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      set_custom_wallpaper_layout::Params::Create(*args_));
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperInfo info;
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->GetLoggedInUserWallpaperInfo(&info);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (info.type != chromeos::User::CUSTOMIZED) {
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetError("Only custom wallpaper can change layout.");
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(false);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  info.layout = wallpaper_api_util::GetLayoutEnum(
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_persistent =
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral();
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->UpdateWallpaper();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets email address while at UI thread.
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction::
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateMinimizeInactiveWindowsFunction() {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction::
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateMinimizeInactiveWindowsFunction() {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateMinimizeInactiveWindowsFunction::RunImpl() {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowStateManager::MinimizeInactiveWindows();
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction::
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateRestoreMinimizedWindowsFunction() {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction::
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateRestoreMinimizedWindowsFunction() {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateRestoreMinimizedWindowsFunction::RunImpl() {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowStateManager::RestoreWindows();
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::WallpaperPrivateGetThumbnailFunction() {
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::~WallpaperPrivateGetThumbnailFunction() {
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateGetThumbnailFunction::RunImpl() {
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<get_thumbnail::Params> params(
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      get_thumbnail::Params::Create(*args_));
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath thumbnail_path;
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
6088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (params->source == get_thumbnail::Params::SOURCE_ONLINE) {
6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string file_name = GURL(params->url_or_file).ExtractFileName();
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS,
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           &thumbnail_path));
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    thumbnail_path = thumbnail_path.Append(file_name);
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!IsOEMDefaultWallpaper()) {
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SetError("No OEM wallpaper.");
6161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SendResponse(false);
6171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return false;
6181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
6191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // TODO(bshe): Small resolution wallpaper is used here as wallpaper
6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // thumbnail. We should either resize it or include a wallpaper thumbnail in
6221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // addition to large and small wallpaper resolutions.
6231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    thumbnail_path = CommandLine::ForCurrentProcess()->GetSwitchValuePath(
6241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        ash::switches::kAshOemWallpaperSmall);
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateGetThumbnailFunction::Get, this,
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 thumbnail_path));
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Failure(
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& file_name) {
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetError(base::StringPrintf("Failed to access wallpaper thumbnails for %s.",
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              file_name.c_str()));
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileNotLoaded() {
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileLoaded(
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& data) {
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* thumbnail = BinaryValue::CreateWithCopiedBuffer(data.c_str(),
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                               data.size());
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(thumbnail);
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Get(const base::FilePath& path) {
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string data;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetData(path, &data)) {
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (data.empty()) {
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::PostTask(
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateGetThumbnailFunction::FileNotLoaded, this));
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::PostTask(
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateGetThumbnailFunction::FileLoaded, this,
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   data));
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateGetThumbnailFunction::Failure, this,
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   path.BaseName().value()));
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction::WallpaperPrivateSaveThumbnailFunction() {
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction::
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSaveThumbnailFunction() {}
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSaveThumbnailFunction::RunImpl() {
6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<save_thumbnail::Params> params(
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      save_thumbnail::Params::Create(*args_));
6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSaveThumbnailFunction::Save,
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 this, params->data, GURL(params->url).ExtractFileName()));
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Failure(
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& file_name) {
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetError(base::StringPrintf("Failed to create/write thumbnail of %s.",
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              file_name.c_str()));
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Success() {
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Save(const std::string& data,
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const std::string& file_name) {
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (SaveData(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, file_name, data)) {
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSaveThumbnailFunction::Success, this));
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          BrowserThread::UI, FROM_HERE,
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&WallpaperPrivateSaveThumbnailFunction::Failure,
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     this, file_name));
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction::
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateGetOfflineWallpaperListFunction() {
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction::
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateGetOfflineWallpaperListFunction() {
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateGetOfflineWallpaperListFunction::RunImpl() {
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::GetList,
7518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 this));
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::GetList() {
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> file_list;
7598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath wallpaper_dir;
7608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir));
7618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (base::DirectoryExists(wallpaper_dir)) {
7628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::FileEnumerator files(wallpaper_dir, false,
7638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                               base::FileEnumerator::FILES);
7648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    for (base::FilePath current = files.Next(); !current.empty();
7658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         current = files.Next()) {
7668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      std::string file_name = current.BaseName().RemoveExtension().value();
7678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // Do not add file name of small resolution wallpaper to the list.
7688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (!EndsWith(file_name, chromeos::kSmallWallpaperSuffix, true))
7698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        file_list.push_back(current.BaseName().value());
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete,
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 this, file_list));
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete(
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<std::string>& file_list) {
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ListValue* results = new ListValue();
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results->AppendStrings(file_list);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(results);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
785