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"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
225e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/pref_names.h"
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/strings/grit/app_locale_settings.h"
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::BinaryValue;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace wallpaper_private = extensions::api::wallpaper_private;
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper_if_exists = wallpaper_private::SetWallpaperIfExists;
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper = wallpaper_private::SetWallpaper;
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper = wallpaper_private::SetCustomWallpaper;
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper_layout =
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    wallpaper_private::SetCustomWallpaperLayout;
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_thumbnail = wallpaper_private::GetThumbnail;
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace save_thumbnail = wallpaper_private::SaveThumbnail;
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_offline_wallpaper_list =
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    wallpaper_private::GetOfflineWallpaperList;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kWallpaperManifestBaseURL[] =
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    "https://storage.googleapis.com/chromeos-wallpaper-public/manifest_";
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool IsOEMDefaultWallpaper() {
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return CommandLine::ForCurrentProcess()->HasSwitch(
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ash::switches::kAshDefaultWallpaperIsOem);
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Saves |data| as |file_name| to directory with |key|. Return false if the
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// directory can not be found/created or failed to write file.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveData(int key, const std::string& file_name, const std::string& data) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_dir;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(PathService::Get(key, &data_dir));
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::DirectoryExists(data_dir) &&
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      !base::CreateDirectory(data_dir)) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path = data_dir.Append(file_name);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return base::PathExists(file_path) ||
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         (base::WriteFile(file_path, data.c_str(), data.size()) != -1);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Gets |file_name| from directory with |key|. Return false if the directory can
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not be found or failed to read file to string |data|. Note if the |file_name|
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// can not be found in the directory, return true with empty |data|. It is
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// expected that we may try to access file which did not saved yet.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetData(const base::FilePath& path, std::string* data) {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_dir = path.DirName();
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::DirectoryExists(data_dir) &&
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      !base::CreateDirectory(data_dir))
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return !base::PathExists(path) ||
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         base::ReadFileToString(path, data);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowStateManager remembers which windows have been minimized in order to
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// restore them when the wallpaper viewer is hidden.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowStateManager : public aura::WindowObserver {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  typedef std::map<std::string, std::set<aura::Window*> >
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      UserIDHashWindowListMap;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Minimizes all windows except the active window.
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static void MinimizeInactiveWindows(const std::string& user_id_hash);
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Unminimizes all minimized windows restoring them to their previous state.
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // This should only be called after calling MinimizeInactiveWindows.
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static void RestoreWindows(const std::string& user_id_hash);
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WindowStateManager();
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~WindowStateManager();
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Store all unminimized windows except |active_window| and minimize them.
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // All the windows are saved in a map and the key value is |user_id_hash|.
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void BuildWindowListAndMinimizeInactiveForUser(
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const std::string& user_id_hash, aura::Window* active_window);
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Unminimize all the stored windows for |user_id_hash|.
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RestoreMinimizedWindows(const std::string& user_id_hash);
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Remove the observer from |window| if |window| is no longer referenced in
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // user_id_hash_window_list_map_.
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RemoveObserverIfUnreferenced(aura::Window* window);
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // aura::WindowObserver overrides.
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Map of user id hash and associated list of minimized windows.
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UserIDHashWindowListMap user_id_hash_window_list_map_;
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowStateManager);
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WindowStateManager* g_window_state_manager = NULL;
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::MinimizeInactiveWindows(
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& user_id_hash) {
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!g_window_state_manager)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_window_state_manager = new WindowStateManager();
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  g_window_state_manager->BuildWindowListAndMinimizeInactiveForUser(
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      user_id_hash, ash::wm::GetActiveWindow());
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::RestoreWindows(const std::string& user_id_hash) {
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!g_window_state_manager) {
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(false) << "This should only be called after calling "
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  << "MinimizeInactiveWindows.";
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  g_window_state_manager->RestoreMinimizedWindows(user_id_hash);
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (g_window_state_manager->user_id_hash_window_list_map_.empty()) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete g_window_state_manager;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_window_state_manager = NULL;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WindowStateManager::WindowStateManager() {}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WindowStateManager::~WindowStateManager() {}
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::BuildWindowListAndMinimizeInactiveForUser(
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& user_id_hash, aura::Window* active_window) {
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (user_id_hash_window_list_map_.find(user_id_hash) ==
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      user_id_hash_window_list_map_.end()) {
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    user_id_hash_window_list_map_[user_id_hash] = std::set<aura::Window*>();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::set<aura::Window*>* results =
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &user_id_hash_window_list_map_[user_id_hash];
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<aura::Window*> windows =
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ash::MruWindowTracker::BuildWindowList(false);
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (std::vector<aura::Window*>::iterator iter = windows.begin();
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       iter != windows.end(); ++iter) {
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Ignore active window and minimized windows.
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (*iter == active_window || ash::wm::GetWindowState(*iter)->IsMinimized())
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      continue;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // TODO(bshe): Add WindowStateObserver too. http://crbug.com/323252
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!(*iter)->HasObserver(this))
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*iter)->AddObserver(this);
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    results->insert(*iter);
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::wm::GetWindowState(*iter)->Minimize();
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::RestoreMinimizedWindows(
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& user_id_hash) {
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UserIDHashWindowListMap::iterator it =
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      user_id_hash_window_list_map_.find(user_id_hash);
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (it == user_id_hash_window_list_map_.end()) {
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(false) << "This should only be called after calling "
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  << "MinimizeInactiveWindows.";
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::set<aura::Window*> removed_windows;
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  removed_windows.swap(it->second);
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  user_id_hash_window_list_map_.erase(it);
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (std::set<aura::Window*>::iterator iter = removed_windows.begin();
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       iter != removed_windows.end(); ++iter) {
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::wm::GetWindowState(*iter)->Unminimize();
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    RemoveObserverIfUnreferenced(*iter);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::RemoveObserverIfUnreferenced(aura::Window* window) {
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (UserIDHashWindowListMap::iterator iter =
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)           user_id_hash_window_list_map_.begin();
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       iter != user_id_hash_window_list_map_.end();
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       ++iter) {
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (iter->second.find(window) != iter->second.end())
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Remove observer if |window| is not observed by any users.
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window->RemoveObserver(this);
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::OnWindowDestroyed(aura::Window* window) {
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (UserIDHashWindowListMap::iterator iter =
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)           user_id_hash_window_list_map_.begin();
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       iter != user_id_hash_window_list_map_.end();
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       ++iter) {
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    iter->second.erase(window);
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool WallpaperPrivateGetStringsFunction::RunSync() {
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetResult(dict);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SET_STRING(id, idr) \
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(id, l10n_util::GetStringUTF16(idr))
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("webFontFamily", IDS_WEB_FONT_FAMILY);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("webFontSize", IDS_WEB_FONT_SIZE);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("allCategoryLabel", IDS_WALLPAPER_MANAGER_ALL_CATEGORY_LABEL);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("deleteCommandLabel", IDS_WALLPAPER_MANAGER_DELETE_COMMAND_LABEL);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("customCategoryLabel",
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_WALLPAPER_MANAGER_CUSTOM_CATEGORY_LABEL);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("selectCustomLabel",
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_WALLPAPER_MANAGER_SELECT_CUSTOM_LABEL);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("positionLabel", IDS_WALLPAPER_MANAGER_POSITION_LABEL);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("colorLabel", IDS_WALLPAPER_MANAGER_COLOR_LABEL);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("centerCroppedLayout",
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_OPTIONS_WALLPAPER_CENTER_CROPPED_LAYOUT);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("centerLayout", IDS_OPTIONS_WALLPAPER_CENTER_LAYOUT);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("stretchLayout", IDS_OPTIONS_WALLPAPER_STRETCH_LAYOUT);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("connectionFailed", IDS_WALLPAPER_MANAGER_ACCESS_FAIL);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("downloadFailed", IDS_WALLPAPER_MANAGER_DOWNLOAD_FAIL);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("downloadCanceled", IDS_WALLPAPER_MANAGER_DOWNLOAD_CANCEL);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("customWallpaperWarning",
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             IDS_WALLPAPER_MANAGER_SHOW_CUSTOM_WALLPAPER_ON_START_WARNING);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("accessFileFailure", IDS_WALLPAPER_MANAGER_ACCESS_FILE_FAILURE);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SET_STRING("invalidWallpaper", IDS_WALLPAPER_MANAGER_INVALID_WALLPAPER);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("surpriseMeLabel", IDS_WALLPAPER_MANAGER_SURPRISE_ME_LABEL);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("learnMore", IDS_LEARN_MORE);
2656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SET_STRING("currentWallpaperSetByMessage",
2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             IDS_CURRENT_WALLPAPER_SET_BY_MESSAGE);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SET_STRING
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::SetFontAndTextDirection(dict);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::WallpaperManager::Get();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::WallpaperInfo info;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (wallpaper_manager->GetLoggedInUserWallpaperInfo(&info))
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    dict->SetString("currentWallpaper", info.location);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dict->SetString("manifestBaseURL", kWallpaperManifestBaseURL);
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(browser_context());
2836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::string app_name(
2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      profile->GetPrefs()->GetString(prefs::kCurrentWallpaperAppName));
2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!app_name.empty())
2866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    dict->SetString("wallpaperAppName", app_name);
2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  dict->SetBoolean("isOEMDefaultWallpaper", IsOEMDefaultWallpaper());
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dict->SetString("canceledWallpaper",
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  wallpaper_api_util::kCancelWallpaperMessage);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction::
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateSetWallpaperIfExistsFunction() {}
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction::
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSetWallpaperIfExistsFunction() {}
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetWallpaperIfExistsFunction::RunAsync() {
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(bshe): Support wallpaper manager in Athena, crbug.com/408734.
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  params = set_wallpaper_if_exists::Params::Create(*args_);
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_id_ = user_manager::UserManager::Get()->GetActiveUser()->email();
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath wallpaper_path;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fallback_path;
310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  chromeos::WallpaperManager::WallpaperResolution resolution =
311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      chromeos::WallpaperManager::GetAppropriateResolution();
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string file_name = GURL(params->url).ExtractFileName();
3148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS,
3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                         &wallpaper_path));
3168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  fallback_path = wallpaper_path.Append(file_name);
3178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (params->layout != wallpaper_private::WALLPAPER_LAYOUT_STRETCH &&
318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      resolution == chromeos::WallpaperManager::WALLPAPER_RESOLUTION_SMALL) {
3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    file_name = base::FilePath(file_name).InsertBeforeExtension(
3208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        chromeos::kSmallWallpaperSuffix).value();
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  wallpaper_path = wallpaper_path.Append(file_name);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &WallpaperPrivateSetWallpaperIfExistsFunction::
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              ReadFileAndInitiateStartDecode,
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this, wallpaper_path, fallback_path));
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReadFileAndInitiateStartDecode(const base::FilePath& file_path,
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const base::FilePath& fallback_path) {
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string data;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path = file_path;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::PathExists(file_path))
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    path = fallback_path;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (base::PathExists(path) &&
35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::ReadFileToString(path, &data)) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::StartDecode,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   this, data));
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error = base::StringPrintf(
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Failed to set wallpaper %s from file system.",
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        path.BaseName().value().c_str());
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 this, error));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnWallpaperDecoded(
3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const gfx::ImageSkia& image) {
369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Set unsafe_wallpaper_decoder_ to null since the decoding already finished.
370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsafe_wallpaper_decoder_ = NULL;
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool update_wallpaper =
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_id_ == user_manager::UserManager::Get()->GetActiveUser()->email();
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->SetWallpaperFromImageSkia(
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      user_id_, image, layout, update_wallpaper);
3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool is_persistent = !user_manager::UserManager::Get()
3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            ->IsCurrentUserNonCryptohomeDataEphemeral();
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  chromeos::WallpaperInfo info = {params->url, layout,
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  user_manager::User::ONLINE,
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  base::Time::Now().LocalMidnight()};
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(user_id_, info, is_persistent);
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetResult(new base::FundamentalValue(true));
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(browser_context());
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This API is only available to the component wallpaper picker. We do not
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // need to show the app's name if it is the component wallpaper picker. So set
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the pref to empty string.
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName,
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 std::string());
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& error) {
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetResult(new base::FundamentalValue(false));
400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  OnFailure(error);
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::WallpaperPrivateSetWallpaperFunction() {
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::~WallpaperPrivateSetWallpaperFunction() {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetWallpaperFunction::RunAsync() {
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  params = set_wallpaper::Params::Create(*args_);
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets email address while at UI thread.
4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_id_ = user_manager::UserManager::Get()->GetActiveUser()->email();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartDecode(params->wallpaper);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::OnWallpaperDecoded(
4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const gfx::ImageSkia& image) {
4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  wallpaper_ = image;
424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Set unsafe_wallpaper_decoder_ to null since the decoding already finished.
425d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsafe_wallpaper_decoder_ = NULL;
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::BLOCK_SHUTDOWN);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSetWallpaperFunction::SaveToFile, this));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SaveToFile() {
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string file_name = GURL(params->url).ExtractFileName();
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (SaveData(chrome::DIR_CHROMEOS_WALLPAPERS, file_name, params->wallpaper)) {
44368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    wallpaper_.EnsureRepsForSupportedScales();
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper_.DeepCopy());
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ImageSkia is not RefCountedThreadSafe. Use a deep copied ImageSkia if
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // post to another thread.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
4485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        BrowserThread::UI,
4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        FROM_HERE,
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper,
4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   this,
4525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   base::Passed(deep_copy.Pass())));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath wallpaper_dir;
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir));
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path = wallpaper_dir.Append(
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        file_name).InsertBeforeExtension(chromeos::kSmallWallpaperSuffix);
4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (base::PathExists(file_path))
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Generates and saves small resolution wallpaper. Uses CENTER_CROPPED to
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // maintain the aspect ratio after resize.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::WallpaperManager::Get()->ResizeAndSaveWallpaper(
4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        wallpaper_,
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        file_path,
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ash::WALLPAPER_LAYOUT_CENTER_CROPPED,
466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        chromeos::kSmallWallpaperMaxWidth,
467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        chromeos::kSmallWallpaperMaxHeight,
468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        NULL);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string error = base::StringPrintf(
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "Failed to create/write wallpaper to %s.", file_name.c_str());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
474d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        base::Bind(&WallpaperPrivateSetWallpaperFunction::OnFailure,
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   this, error));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper(
4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    scoped_ptr<gfx::ImageSkia> image) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::WallpaperManager::Get();
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool update_wallpaper =
4886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_id_ == user_manager::UserManager::Get()->GetActiveUser()->email();
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->SetWallpaperFromImageSkia(
4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      user_id_, *image.get(), layout, update_wallpaper);
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool is_persistent = !user_manager::UserManager::Get()
4936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            ->IsCurrentUserNonCryptohomeDataEphemeral();
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  chromeos::WallpaperInfo info = {params->url, layout,
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  user_manager::User::ONLINE,
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  base::Time::Now().LocalMidnight()};
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(browser_context());
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This API is only available to the component wallpaper picker. We do not
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // need to show the app's name if it is the component wallpaper picker. So set
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the pref to empty string.
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName,
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 std::string());
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(user_id_, info, is_persistent);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendResponse(true);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction::
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateResetWallpaperFunction() {}
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction::
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateResetWallpaperFunction() {}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateResetWallpaperFunction::RunAsync() {
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
5166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string user_id = user_manager->GetActiveUser()->email();
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->RemoveUserWallpaperInfo(user_id);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  chromeos::WallpaperInfo info = {std::string(),
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  ash::WALLPAPER_LAYOUT_CENTER,
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  user_manager::User::DEFAULT,
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  base::Time::Now().LocalMidnight()};
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_persistent =
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !user_manager->IsCurrentUserNonCryptohomeDataEphemeral();
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(user_id, info, is_persistent);
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->SetDefaultWallpaperNow(user_id);
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(browser_context());
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This API is only available to the component wallpaper picker. We do not
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // need to show the app's name if it is the component wallpaper picker. So set
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the pref to empty string.
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName,
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 std::string());
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction::
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateSetCustomWallpaperFunction() {}
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction::
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSetCustomWallpaperFunction() {}
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperFunction::RunAsync() {
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  params = set_custom_wallpaper::Params::Create(*args_);
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Gets email address and username hash while at UI thread.
5506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_id_ = user_manager::UserManager::Get()->GetActiveUser()->email();
5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  user_id_hash_ =
5526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetActiveUser()->username_hash();
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartDecode(params->wallpaper);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::OnWallpaperDecoded(
5605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const gfx::ImageSkia& image) {
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath thumbnail_path = wallpaper_manager->GetCustomWallpaperPath(
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::kThumbnailWallpaperSubDir, user_id_hash_, params->file_name);
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::BLOCK_SHUTDOWN);
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool update_wallpaper =
5776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_id_ == user_manager::UserManager::Get()->GetActiveUser()->email();
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallpaper_manager->SetCustomWallpaper(user_id_,
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        user_id_hash_,
5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        params->file_name,
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        layout,
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        user_manager::User::CUSTOMIZED,
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        image,
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        update_wallpaper);
585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsafe_wallpaper_decoder_ = NULL;
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(browser_context());
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This API is only available to the component wallpaper picker. We do not
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // need to show the app's name if it is the component wallpaper picker. So set
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the pref to empty string.
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName,
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 std::string());
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (params->generate_thumbnail) {
5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    image.EnsureRepsForSupportedScales();
5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    scoped_ptr<gfx::ImageSkia> deep_copy(image.DeepCopy());
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Generates thumbnail before call api function callback. We can then
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // request thumbnail in the javascript callback.
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task_runner->PostTask(FROM_HERE,
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail,
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, thumbnail_path, base::Passed(&deep_copy)));
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(true);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail(
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& thumbnail_path, scoped_ptr<gfx::ImageSkia> image) {
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
6127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::PathExists(thumbnail_path.DirName()))
613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::CreateDirectory(thumbnail_path.DirName());
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  chromeos::WallpaperManager::Get()->ResizeImage(
6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      *image,
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::WALLPAPER_LAYOUT_STRETCH,
619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      chromeos::kWallpaperThumbnailWidth,
620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      chromeos::kWallpaperThumbnailHeight,
621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      &data,
622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      NULL);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated,
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, data));
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated(
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::RefCountedBytes* data) {
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* result = BinaryValue::CreateWithCopiedBuffer(
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reinterpret_cast<const char*>(data->front()), data->size());
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(result);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendResponse(true);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction::
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateSetCustomWallpaperLayoutFunction() {}
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction::
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSetCustomWallpaperLayoutFunction() {}
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperLayoutFunction::RunAsync() {
6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<set_custom_wallpaper_layout::Params> params(
6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      set_custom_wallpaper_layout::Params::Create(*args_));
6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperManager* wallpaper_manager =
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::WallpaperManager::Get();
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::WallpaperInfo info;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->GetLoggedInUserWallpaperInfo(&info);
6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (info.type != user_manager::User::CUSTOMIZED) {
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetError("Only custom wallpaper can change layout.");
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(false);
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  info.layout = wallpaper_api_util::GetLayoutEnum(
6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallpaper_private::ToString(params->layout));
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string email =
6626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetActiveUser()->email();
6636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool is_persistent = !user_manager::UserManager::Get()
6646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            ->IsCurrentUserNonCryptohomeDataEphemeral();
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wallpaper_manager->UpdateWallpaper(false /* clear_cache */);
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets email address while at UI thread.
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction::
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateMinimizeInactiveWindowsFunction() {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction::
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateMinimizeInactiveWindowsFunction() {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateMinimizeInactiveWindowsFunction::RunAsync() {
682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WindowStateManager::MinimizeInactiveWindows(
6836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetActiveUser()->username_hash());
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction::
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateRestoreMinimizedWindowsFunction() {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction::
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateRestoreMinimizedWindowsFunction() {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateRestoreMinimizedWindowsFunction::RunAsync() {
696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WindowStateManager::RestoreWindows(
6976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetActiveUser()->username_hash());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::WallpaperPrivateGetThumbnailFunction() {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::~WallpaperPrivateGetThumbnailFunction() {
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateGetThumbnailFunction::RunAsync() {
7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<get_thumbnail::Params> params(
7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      get_thumbnail::Params::Create(*args_));
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath thumbnail_path;
7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string email =
7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetActiveUser()->email();
7158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (params->source == get_thumbnail::Params::SOURCE_ONLINE) {
7164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string file_name = GURL(params->url_or_file).ExtractFileName();
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS,
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           &thumbnail_path));
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    thumbnail_path = thumbnail_path.Append(file_name);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!IsOEMDefaultWallpaper()) {
7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SetError("No OEM wallpaper.");
7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SendResponse(false);
7241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return false;
7251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
7261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // TODO(bshe): Small resolution wallpaper is used here as wallpaper
7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // thumbnail. We should either resize it or include a wallpaper thumbnail in
7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // addition to large and small wallpaper resolutions.
7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    thumbnail_path = CommandLine::ForCurrentProcess()->GetSwitchValuePath(
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ash::switches::kAshDefaultWallpaperSmall);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateGetThumbnailFunction::Get, this,
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 thumbnail_path));
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Failure(
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& file_name) {
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetError(base::StringPrintf("Failed to access wallpaper thumbnails for %s.",
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              file_name.c_str()));
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileNotLoaded() {
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileLoaded(
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& data) {
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* thumbnail = BinaryValue::CreateWithCopiedBuffer(data.c_str(),
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                               data.size());
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(thumbnail);
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Get(const base::FilePath& path) {
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string data;
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetData(path, &data)) {
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (data.empty()) {
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::PostTask(
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateGetThumbnailFunction::FileNotLoaded, this));
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::PostTask(
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateGetThumbnailFunction::FileLoaded, this,
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   data));
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BrowserThread::UI, FROM_HERE,
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&WallpaperPrivateGetThumbnailFunction::Failure, this,
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   path.BaseName().value()));
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction::WallpaperPrivateSaveThumbnailFunction() {
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction::
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateSaveThumbnailFunction() {}
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSaveThumbnailFunction::RunAsync() {
7964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<save_thumbnail::Params> params(
7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      save_thumbnail::Params::Create(*args_));
7984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSaveThumbnailFunction::Save,
8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 this, params->data, GURL(params->url).ExtractFileName()));
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Failure(
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& file_name) {
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetError(base::StringPrintf("Failed to create/write thumbnail of %s.",
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              file_name.c_str()));
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Success() {
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Save(const std::string& data,
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const std::string& file_name) {
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (SaveData(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, file_name, data)) {
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateSaveThumbnailFunction::Success, this));
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          BrowserThread::UI, FROM_HERE,
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&WallpaperPrivateSaveThumbnailFunction::Failure,
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     this, file_name));
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction::
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WallpaperPrivateGetOfflineWallpaperListFunction() {
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction::
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~WallpaperPrivateGetOfflineWallpaperListFunction() {
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateGetOfflineWallpaperListFunction::RunAsync() {
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sequence_token_ = BrowserThread::GetBlockingPool()->
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner =
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runner->PostTask(FROM_HERE,
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::GetList,
8588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 this));
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::GetList() {
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sequence_token_));
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> file_list;
8668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath wallpaper_dir;
8678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir));
8688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (base::DirectoryExists(wallpaper_dir)) {
8698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::FileEnumerator files(wallpaper_dir, false,
8708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                               base::FileEnumerator::FILES);
8718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    for (base::FilePath current = files.Next(); !current.empty();
8728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         current = files.Next()) {
8738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      std::string file_name = current.BaseName().RemoveExtension().value();
8748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // Do not add file name of small resolution wallpaper to the list.
8758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (!EndsWith(file_name, chromeos::kSmallWallpaperSuffix, true))
8768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        file_list.push_back(current.BaseName().value());
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete,
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 this, file_list));
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete(
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<std::string>& file_list) {
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* results = new base::ListValue();
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results->AppendStrings(file_list);
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(results);
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892