| Index: ash/desktop_background/desktop_background_controller.cc
|
| diff --git a/ash/desktop_background/desktop_background_controller.cc b/ash/desktop_background/desktop_background_controller.cc
|
| index 730558696d93d2ce82e7a7dcb78b172c32d568d2..fe111c05e098aabce876793c002f18a606ee2336 100644
|
| --- a/ash/desktop_background/desktop_background_controller.cc
|
| +++ b/ash/desktop_background/desktop_background_controller.cc
|
| @@ -24,7 +24,6 @@
|
| #include "base/synchronization/cancellation_flag.h"
|
| #include "base/threading/worker_pool.h"
|
| #include "content/public/browser/browser_thread.h"
|
| -#include "grit/ash_resources.h"
|
| #include "ui/aura/window.h"
|
| #include "ui/aura/window_event_dispatcher.h"
|
| #include "ui/compositor/layer.h"
|
| @@ -44,127 +43,14 @@ const int kWallpaperReloadDelayMs = 2000;
|
|
|
| } // namespace
|
|
|
| -const int kSmallWallpaperMaxWidth = 1366;
|
| -const int kSmallWallpaperMaxHeight = 800;
|
| -const int kLargeWallpaperMaxWidth = 2560;
|
| -const int kLargeWallpaperMaxHeight = 1700;
|
| -const int kWallpaperThumbnailWidth = 108;
|
| -const int kWallpaperThumbnailHeight = 68;
|
| -
|
| -// DesktopBackgroundController::WallpaperLoader wraps background wallpaper
|
| -// loading.
|
| -class DesktopBackgroundController::WallpaperLoader
|
| - : public base::RefCountedThreadSafe<
|
| - DesktopBackgroundController::WallpaperLoader> {
|
| - public:
|
| - // If set, |file_path| must be a trusted (i.e. read-only,
|
| - // non-user-controlled) file containing a JPEG image.
|
| - WallpaperLoader(const base::FilePath& file_path,
|
| - WallpaperLayout file_layout,
|
| - int resource_id,
|
| - WallpaperLayout resource_layout)
|
| - : file_path_(file_path),
|
| - file_layout_(file_layout),
|
| - resource_id_(resource_id),
|
| - resource_layout_(resource_layout) {
|
| - }
|
| -
|
| - void LoadOnWorkerPoolThread() {
|
| - DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - if (cancel_flag_.IsSet())
|
| - return;
|
| -
|
| - if (!file_path_.empty()) {
|
| - VLOG(1) << "Loading " << file_path_.value();
|
| - file_bitmap_ = LoadSkBitmapFromJPEGFile(file_path_);
|
| - }
|
| -
|
| - if (cancel_flag_.IsSet())
|
| - return;
|
| -
|
| - if (file_bitmap_) {
|
| - gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(*file_bitmap_);
|
| - wallpaper_resizer_.reset(new WallpaperResizer(
|
| - image, GetMaxDisplaySizeInNative(), file_layout_));
|
| - } else {
|
| - wallpaper_resizer_.reset(new WallpaperResizer(
|
| - resource_id_, GetMaxDisplaySizeInNative(), resource_layout_));
|
| - }
|
| - }
|
| -
|
| - const base::FilePath& file_path() const { return file_path_; }
|
| - int resource_id() const { return resource_id_; }
|
| -
|
| - void Cancel() {
|
| - cancel_flag_.Set();
|
| - }
|
| -
|
| - bool IsCanceled() {
|
| - return cancel_flag_.IsSet();
|
| - }
|
| -
|
| - WallpaperResizer* ReleaseWallpaperResizer() {
|
| - return wallpaper_resizer_.release();
|
| - }
|
| -
|
| - private:
|
| - friend class base::RefCountedThreadSafe<
|
| - DesktopBackgroundController::WallpaperLoader>;
|
| -
|
| - // Loads a JPEG image from |path|, a trusted file -- note that the image
|
| - // is not loaded in a sandboxed process. Returns an empty pointer on
|
| - // error.
|
| - static scoped_ptr<SkBitmap> LoadSkBitmapFromJPEGFile(
|
| - const base::FilePath& path) {
|
| - std::string data;
|
| - if (!base::ReadFileToString(path, &data)) {
|
| - LOG(ERROR) << "Unable to read data from " << path.value();
|
| - return scoped_ptr<SkBitmap>();
|
| - }
|
| -
|
| - scoped_ptr<SkBitmap> bitmap(gfx::JPEGCodec::Decode(
|
| - reinterpret_cast<const unsigned char*>(data.data()), data.size()));
|
| - if (!bitmap)
|
| - LOG(ERROR) << "Unable to decode JPEG data from " << path.value();
|
| - return bitmap.Pass();
|
| - }
|
| -
|
| - ~WallpaperLoader() {}
|
| -
|
| - base::CancellationFlag cancel_flag_;
|
| -
|
| - // Bitmap loaded from |file_path_|.
|
| - scoped_ptr<SkBitmap> file_bitmap_;
|
| -
|
| - scoped_ptr<WallpaperResizer> wallpaper_resizer_;
|
| -
|
| - // Path to a trusted JPEG file.
|
| - base::FilePath file_path_;
|
| -
|
| - // Layout to be used when displaying the image from |file_path_|.
|
| - WallpaperLayout file_layout_;
|
| -
|
| - // ID of an image resource to use if |file_path_| is empty or unloadable.
|
| - int resource_id_;
|
| -
|
| - // Layout to be used when displaying |resource_id_|.
|
| - WallpaperLayout resource_layout_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WallpaperLoader);
|
| -};
|
| -
|
| DesktopBackgroundController::DesktopBackgroundController()
|
| - : command_line_for_testing_(NULL),
|
| - locked_(false),
|
| + : locked_(false),
|
| desktop_background_mode_(BACKGROUND_NONE),
|
| - current_default_wallpaper_resource_id_(-1),
|
| - weak_ptr_factory_(this),
|
| wallpaper_reload_delay_(kWallpaperReloadDelayMs) {
|
| Shell::GetInstance()->display_controller()->AddObserver(this);
|
| }
|
|
|
| DesktopBackgroundController::~DesktopBackgroundController() {
|
| - CancelDefaultWallpaperLoader();
|
| Shell::GetInstance()->display_controller()->RemoveObserver(this);
|
| }
|
|
|
| @@ -207,80 +93,44 @@ void DesktopBackgroundController::OnRootWindowAdded(aura::Window* root_window) {
|
| InstallDesktopController(root_window);
|
| }
|
|
|
| -bool DesktopBackgroundController::SetDefaultWallpaper(bool is_guest) {
|
| - VLOG(1) << "SetDefaultWallpaper: is_guest=" << is_guest;
|
| - const bool use_large =
|
| - GetAppropriateResolution() == WALLPAPER_RESOLUTION_LARGE;
|
| -
|
| - base::FilePath file_path;
|
| - WallpaperLayout file_layout = use_large ? WALLPAPER_LAYOUT_CENTER_CROPPED :
|
| - WALLPAPER_LAYOUT_CENTER;
|
| - int resource_id = use_large ? IDR_AURA_WALLPAPER_DEFAULT_LARGE :
|
| - IDR_AURA_WALLPAPER_DEFAULT_SMALL;
|
| - WallpaperLayout resource_layout = WALLPAPER_LAYOUT_TILE;
|
| -
|
| - CommandLine* command_line = command_line_for_testing_ ?
|
| - command_line_for_testing_ : CommandLine::ForCurrentProcess();
|
| - const char* switch_name = NULL;
|
| - if (is_guest) {
|
| - switch_name = use_large ? switches::kAshGuestWallpaperLarge :
|
| - switches::kAshGuestWallpaperSmall;
|
| - } else {
|
| - switch_name = use_large ? switches::kAshDefaultWallpaperLarge :
|
| - switches::kAshDefaultWallpaperSmall;
|
| - }
|
| - file_path = command_line->GetSwitchValuePath(switch_name);
|
| +bool DesktopBackgroundController::SetWallpaperImage(const gfx::ImageSkia& image,
|
| + WallpaperLayout layout) {
|
| + VLOG(1) << "SetWallpaper: image_id=" << WallpaperResizer::GetImageId(image)
|
| + << " layout=" << layout;
|
|
|
| - if (DefaultWallpaperIsAlreadyLoadingOrLoaded(file_path, resource_id)) {
|
| - VLOG(1) << "Default wallpaper is already loading or loaded";
|
| + if (WallpaperIsAlreadyLoaded(&image, kInvalidResourceID, layout)) {
|
| + VLOG(1) << "Wallpaper is already loaded";
|
| return false;
|
| }
|
|
|
| - CancelDefaultWallpaperLoader();
|
| - default_wallpaper_loader_ = new WallpaperLoader(
|
| - file_path, file_layout, resource_id, resource_layout);
|
| - base::WorkerPool::PostTaskAndReply(
|
| - FROM_HERE,
|
| - base::Bind(&WallpaperLoader::LoadOnWorkerPoolThread,
|
| - default_wallpaper_loader_),
|
| - base::Bind(&DesktopBackgroundController::OnDefaultWallpaperLoadCompleted,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - default_wallpaper_loader_),
|
| - true /* task_is_slow */);
|
| + current_wallpaper_.reset(
|
| + new WallpaperResizer(image, GetMaxDisplaySizeInNative(), layout));
|
| + current_wallpaper_->StartResize();
|
| +
|
| + FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver,
|
| + observers_,
|
| + OnWallpaperDataChanged());
|
| + SetDesktopBackgroundImageMode();
|
| return true;
|
| }
|
|
|
| -void DesktopBackgroundController::SetCustomWallpaper(
|
| - const gfx::ImageSkia& image,
|
| - WallpaperLayout layout) {
|
| - VLOG(1) << "SetCustomWallpaper: image_id="
|
| - << WallpaperResizer::GetImageId(image) << " layout=" << layout;
|
| - CancelDefaultWallpaperLoader();
|
| +bool DesktopBackgroundController::SetWallpaperResource(int resource_id,
|
| + WallpaperLayout layout) {
|
| + VLOG(1) << "SetWallpaper: resource_id=" << resource_id
|
| + << " layout=" << layout;
|
|
|
| - if (CustomWallpaperIsAlreadyLoaded(image)) {
|
| - VLOG(1) << "Custom wallpaper is already loaded";
|
| - return;
|
| + if (WallpaperIsAlreadyLoaded(NULL, resource_id, layout)) {
|
| + VLOG(1) << "Wallpaper is already loaded";
|
| + return false;
|
| }
|
| -
|
| - current_wallpaper_.reset(new WallpaperResizer(
|
| - image, GetMaxDisplaySizeInNative(), layout));
|
| + current_wallpaper_.reset(
|
| + new WallpaperResizer(resource_id, GetMaxDisplaySizeInNative(), layout));
|
| current_wallpaper_->StartResize();
|
|
|
| - current_default_wallpaper_path_ = base::FilePath();
|
| - current_default_wallpaper_resource_id_ = -1;
|
| -
|
| FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_,
|
| OnWallpaperDataChanged());
|
| SetDesktopBackgroundImageMode();
|
| -}
|
| -
|
| -void DesktopBackgroundController::CancelDefaultWallpaperLoader() {
|
| - // Set canceled flag of previous request to skip unneeded loading.
|
| - if (default_wallpaper_loader_.get())
|
| - default_wallpaper_loader_->Cancel();
|
| -
|
| - // Cancel reply callback for previous request.
|
| - weak_ptr_factory_.InvalidateWeakPtrs();
|
| + return true;
|
| }
|
|
|
| void DesktopBackgroundController::CreateEmptyWallpaper() {
|
| @@ -288,14 +138,6 @@ void DesktopBackgroundController::CreateEmptyWallpaper() {
|
| SetDesktopBackgroundImageMode();
|
| }
|
|
|
| -WallpaperResolution DesktopBackgroundController::GetAppropriateResolution() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - gfx::Size size = GetMaxDisplaySizeInNative();
|
| - return (size.width() > kSmallWallpaperMaxWidth ||
|
| - size.height() > kSmallWallpaperMaxHeight) ?
|
| - WALLPAPER_RESOLUTION_LARGE : WALLPAPER_RESOLUTION_SMALL;
|
| -}
|
| -
|
| bool DesktopBackgroundController::MoveDesktopToLockedContainer() {
|
| if (locked_)
|
| return false;
|
| @@ -327,23 +169,44 @@ void DesktopBackgroundController::OnDisplayConfigurationChanged() {
|
| }
|
| }
|
|
|
| -bool DesktopBackgroundController::DefaultWallpaperIsAlreadyLoadingOrLoaded(
|
| - const base::FilePath& image_file,
|
| - int image_resource_id) const {
|
| - return (default_wallpaper_loader_.get() &&
|
| - !default_wallpaper_loader_->IsCanceled() &&
|
| - default_wallpaper_loader_->file_path() == image_file &&
|
| - default_wallpaper_loader_->resource_id() == image_resource_id) ||
|
| - (current_wallpaper_.get() &&
|
| - current_default_wallpaper_path_ == image_file &&
|
| - current_default_wallpaper_resource_id_ == image_resource_id);
|
| +// static
|
| +gfx::Size DesktopBackgroundController::GetMaxDisplaySizeInNative() {
|
| + int width = 0;
|
| + int height = 0;
|
| + std::vector<gfx::Display> displays = Shell::GetScreen()->GetAllDisplays();
|
| + DisplayManager* display_manager = Shell::GetInstance()->display_manager();
|
| +
|
| + for (std::vector<gfx::Display>::iterator iter = displays.begin();
|
| + iter != displays.end(); ++iter) {
|
| + // Don't use size_in_pixel because we want to use the native pixel size.
|
| + gfx::Size size_in_pixel =
|
| + display_manager->GetDisplayInfo(iter->id()).bounds_in_native().size();
|
| + if (iter->rotation() == gfx::Display::ROTATE_90 ||
|
| + iter->rotation() == gfx::Display::ROTATE_270) {
|
| + size_in_pixel = gfx::Size(size_in_pixel.height(), size_in_pixel.width());
|
| + }
|
| + width = std::max(size_in_pixel.width(), width);
|
| + height = std::max(size_in_pixel.height(), height);
|
| + }
|
| + return gfx::Size(width, height);
|
| }
|
|
|
| -bool DesktopBackgroundController::CustomWallpaperIsAlreadyLoaded(
|
| - const gfx::ImageSkia& image) const {
|
| - return current_wallpaper_.get() &&
|
| - (WallpaperResizer::GetImageId(image) ==
|
| - current_wallpaper_->original_image_id());
|
| +bool DesktopBackgroundController::WallpaperIsAlreadyLoaded(
|
| + const gfx::ImageSkia* image,
|
| + int resource_id,
|
| + WallpaperLayout layout) const {
|
| + if (!current_wallpaper_.get())
|
| + return false;
|
| +
|
| + if (layout != current_wallpaper_->layout())
|
| + return false;
|
| +
|
| + if (image) {
|
| + return WallpaperResizer::GetImageId(*image) ==
|
| + current_wallpaper_->original_image_id();
|
| + }
|
| +
|
| + return current_wallpaper_->resource_id() == resource_id;
|
| }
|
|
|
| void DesktopBackgroundController::SetDesktopBackgroundImageMode() {
|
| @@ -351,22 +214,6 @@ void DesktopBackgroundController::SetDesktopBackgroundImageMode() {
|
| InstallDesktopControllerForAllWindows();
|
| }
|
|
|
| -void DesktopBackgroundController::OnDefaultWallpaperLoadCompleted(
|
| - scoped_refptr<WallpaperLoader> loader) {
|
| - VLOG(1) << "OnDefaultWallpaperLoadCompleted";
|
| - current_wallpaper_.reset(loader->ReleaseWallpaperResizer());
|
| - current_wallpaper_->StartResize();
|
| - current_default_wallpaper_path_ = loader->file_path();
|
| - current_default_wallpaper_resource_id_ = loader->resource_id();
|
| - FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_,
|
| - OnWallpaperDataChanged());
|
| -
|
| - SetDesktopBackgroundImageMode();
|
| -
|
| - DCHECK(loader.get() == default_wallpaper_loader_.get());
|
| - default_wallpaper_loader_ = NULL;
|
| -}
|
| -
|
| void DesktopBackgroundController::InstallDesktopController(
|
| aura::Window* root_window) {
|
| DesktopBackgroundWidgetController* component = NULL;
|
| @@ -443,32 +290,8 @@ int DesktopBackgroundController::GetBackgroundContainerId(bool locked) {
|
|
|
| void DesktopBackgroundController::UpdateWallpaper() {
|
| current_wallpaper_.reset(NULL);
|
| - current_default_wallpaper_path_ = base::FilePath();
|
| - current_default_wallpaper_resource_id_ = -1;
|
| ash::Shell::GetInstance()->user_wallpaper_delegate()->
|
| UpdateWallpaper(true /* clear cache */);
|
| }
|
|
|
| -// static
|
| -gfx::Size DesktopBackgroundController::GetMaxDisplaySizeInNative() {
|
| - int width = 0;
|
| - int height = 0;
|
| - std::vector<gfx::Display> displays = Shell::GetScreen()->GetAllDisplays();
|
| - DisplayManager* display_manager = Shell::GetInstance()->display_manager();
|
| -
|
| - for (std::vector<gfx::Display>::iterator iter = displays.begin();
|
| - iter != displays.end(); ++iter) {
|
| - // Don't use size_in_pixel because we want to use the native pixel size.
|
| - gfx::Size size_in_pixel =
|
| - display_manager->GetDisplayInfo(iter->id()).bounds_in_native().size();
|
| - if (iter->rotation() == gfx::Display::ROTATE_90 ||
|
| - iter->rotation() == gfx::Display::ROTATE_270) {
|
| - size_in_pixel = gfx::Size(size_in_pixel.height(), size_in_pixel.width());
|
| - }
|
| - width = std::max(size_in_pixel.width(), width);
|
| - height = std::max(size_in_pixel.height(), height);
|
| - }
|
| - return gfx::Size(width, height);
|
| -}
|
| -
|
| } // namespace ash
|
|
|