Skip to content

Commit

Permalink
Remove use of index in wallpaper picker code and some refactor
Browse files Browse the repository at this point in the history
BUG=141431

Review URL: https://codereview.chromium.org/11415015

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@168818 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
bshe@chromium.org committed Nov 20, 2012
1 parent 2dca2dc commit 0c3461a
Show file tree
Hide file tree
Showing 18 changed files with 190 additions and 383 deletions.
2 changes: 0 additions & 2 deletions ash/ash.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@
'desktop_background/desktop_background_controller.cc',
'desktop_background/desktop_background_controller.h',
'desktop_background/desktop_background_controller_observer.h',
'desktop_background/desktop_background_resources.cc',
'desktop_background/desktop_background_resources.h',
'desktop_background/desktop_background_view.cc',
'desktop_background/desktop_background_view.h',
'desktop_background/desktop_background_widget_controller.cc',
Expand Down
168 changes: 75 additions & 93 deletions ash/desktop_background/desktop_background_controller.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "base/synchronization/cancellation_flag.h"
#include "base/threading/worker_pool.h"
#include "content/public/browser/browser_thread.h"
#include "grit/ash_wallpaper_resources.h"
#include "ui/aura/root_window.h"
#include "ui/aura/window.h"
#include "ui/base/resource/resource_bundle.h"
Expand All @@ -43,59 +44,65 @@ internal::RootWindowLayoutManager* GetRootWindowLayoutManager(
}
} // namespace

#if defined(GOOGLE_CHROME_BUILD)
const WallpaperInfo kDefaultLargeWallpaper =
{ IDR_AURA_WALLPAPERS_2_LANDSCAPE8_LARGE, WALLPAPER_LAYOUT_CENTER_CROPPED };
const WallpaperInfo kDefaultSmallWallpaper =
{ IDR_AURA_WALLPAPERS_2_LANDSCAPE8_SMALL, WALLPAPER_LAYOUT_CENTER };
const WallpaperInfo kGuestLargeWallpaper =
{ IDR_AURA_WALLPAPERS_2_LANDSCAPE7_LARGE, WALLPAPER_LAYOUT_CENTER_CROPPED };
const WallpaperInfo kGuestSmallWallpaper =
{ IDR_AURA_WALLPAPERS_2_LANDSCAPE7_SMALL, WALLPAPER_LAYOUT_CENTER };
#else
const WallpaperInfo kDefaultLargeWallpaper =
{ IDR_AURA_WALLPAPERS_5_GRADIENT5_LARGE, WALLPAPER_LAYOUT_TILE };
const WallpaperInfo kDefaultSmallWallpaper =
{ IDR_AURA_WALLPAPERS_5_GRADIENT5_SMALL, WALLPAPER_LAYOUT_TILE };
const WallpaperInfo kGuestLargeWallpaper = kDefaultLargeWallpaper;
const WallpaperInfo kGuestSmallWallpaper = kDefaultSmallWallpaper;
#endif

const int kSmallWallpaperMaxWidth = 1366;
const int kSmallWallpaperMaxHeight = 800;
const int kLargeWallpaperMaxWidth = 2560;
const int kLargeWallpaperMaxHeight = 1700;

// Stores the current wallpaper data.
struct DesktopBackgroundController::WallpaperData {
WallpaperData(int index, WallpaperResolution resolution)
: is_default_wallpaper(true),
wallpaper_index(index),
wallpaper_layout(GetWallpaperViewInfo(index, resolution).layout),
explicit WallpaperData(const WallpaperInfo& info)
: wallpaper_info(info),
wallpaper_image(*(ui::ResourceBundle::GetSharedInstance().GetImageNamed(
GetWallpaperViewInfo(index, resolution).id).ToImageSkia())) {
info.idr).ToImageSkia())) {
}
WallpaperData(WallpaperLayout layout, const gfx::ImageSkia& image)
: is_default_wallpaper(false),
wallpaper_index(-1),
wallpaper_layout(layout),
WallpaperData(const WallpaperInfo& info, const gfx::ImageSkia& image)
: wallpaper_info(info),
wallpaper_image(image) {
}
const bool is_default_wallpaper;
const int wallpaper_index;
const WallpaperLayout wallpaper_layout;
const WallpaperInfo wallpaper_info;
const gfx::ImageSkia wallpaper_image;
};

// DesktopBackgroundController::WallpaperOperation wraps background wallpaper
// DesktopBackgroundController::WallpaperLoader wraps background wallpaper
// loading.
class DesktopBackgroundController::WallpaperOperation
class DesktopBackgroundController::WallpaperLoader
: public base::RefCountedThreadSafe<
DesktopBackgroundController::WallpaperOperation> {
DesktopBackgroundController::WallpaperLoader> {
public:
WallpaperOperation(int index, WallpaperResolution resolution)
: index_(index),
resolution_(resolution) {
}

static void Run(scoped_refptr<WallpaperOperation> wo) {
wo->LoadingWallpaper();
explicit WallpaperLoader(const WallpaperInfo& info)
: info_(info) {
}

void LoadingWallpaper() {
if (cancel_flag_.IsSet())
return;
wallpaper_data_.reset(new WallpaperData(index_, resolution_));
static void LoadOnWorkerPoolThread(scoped_refptr<WallpaperLoader> wl) {
DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
wl->LoadingWallpaper();
}

void Cancel() {
cancel_flag_.Set();
}

int index() const {
return index_;
int idr() const {
return info_.idr;
}

WallpaperData* ReleaseWallpaperData() {
Expand All @@ -104,19 +111,23 @@ class DesktopBackgroundController::WallpaperOperation

private:
friend class base::RefCountedThreadSafe<
DesktopBackgroundController::WallpaperOperation>;
DesktopBackgroundController::WallpaperLoader>;

~WallpaperOperation() {}
void LoadingWallpaper() {
if (cancel_flag_.IsSet())
return;
wallpaper_data_.reset(new WallpaperData(info_));
}

~WallpaperLoader() {}

base::CancellationFlag cancel_flag_;

scoped_ptr<WallpaperData> wallpaper_data_;

const int index_;

const WallpaperResolution resolution_;
const WallpaperInfo info_;

DISALLOW_COPY_AND_ASSIGN(WallpaperOperation);
DISALLOW_COPY_AND_ASSIGN(WallpaperLoader);
};

DesktopBackgroundController::DesktopBackgroundController()
Expand Down Expand Up @@ -148,8 +159,8 @@ void DesktopBackgroundController::RemoveObserver(

WallpaperLayout DesktopBackgroundController::GetWallpaperLayout() const {
if (current_wallpaper_.get())
return current_wallpaper_->wallpaper_layout;
return CENTER_CROPPED;
return current_wallpaper_->wallpaper_info.layout;
return WALLPAPER_LAYOUT_CENTER_CROPPED;
}

gfx::ImageSkia DesktopBackgroundController::GetCurrentWallpaperImage() {
Expand All @@ -158,6 +169,15 @@ gfx::ImageSkia DesktopBackgroundController::GetCurrentWallpaperImage() {
return GetWallpaper();
}

int DesktopBackgroundController::GetWallpaperIDR() const {
if (wallpaper_loader_.get())
return wallpaper_loader_->idr();
else if (current_wallpaper_.get())
return current_wallpaper_->wallpaper_info.idr;
else
return -1;
}

void DesktopBackgroundController::OnRootWindowAdded(
aura::RootWindow* root_window) {
// Handle resolution change for "built-in" images."
Expand All @@ -168,69 +188,30 @@ void DesktopBackgroundController::OnRootWindowAdded(
// small screen.
if (kSmallWallpaperMaxWidth < root_window_size.width() ||
kSmallWallpaperMaxHeight < root_window_size.height()) {
if (current_wallpaper_->is_default_wallpaper) {
ReloadDefaultWallpaper();
} else {
ash::Shell::GetInstance()->user_wallpaper_delegate()->
UpdateWallpaper();
}
current_wallpaper_.reset(NULL);
ash::Shell::GetInstance()->user_wallpaper_delegate()->
UpdateWallpaper();
}
}

InstallDesktopController(root_window);
}

void DesktopBackgroundController::CacheDefaultWallpaper(int index) {
DCHECK(index >= 0);

WallpaperResolution resolution = GetAppropriateResolution();
scoped_refptr<WallpaperOperation> wallpaper_op =
new WallpaperOperation(index, resolution);
base::WorkerPool::PostTask(
FROM_HERE,
base::Bind(&WallpaperOperation::Run, wallpaper_op),
true);
}

void DesktopBackgroundController::SetDefaultWallpaper(int index) {
// We should not change background when index is invalid. For instance, at
// login screen or stub_user login.
if (index == GetInvalidWallpaperIndex()) {
CreateEmptyWallpaper();
return;
} else if (index == GetSolidColorIndex()) {
SetDesktopBackgroundSolidColorMode(kLoginWallpaperColor);
return;
}

// Prevents loading of the same wallpaper as the currently loading/loaded
// one.
if ((wallpaper_op_.get() && wallpaper_op_->index() == index) ||
(current_wallpaper_.get() &&
current_wallpaper_->wallpaper_index == index)) {
return;
}
void DesktopBackgroundController::SetDefaultWallpaper(
const WallpaperInfo& info) {
DCHECK_NE(GetWallpaperIDR(), info.idr);

CancelPendingWallpaperOperation();

WallpaperResolution resolution = GetAppropriateResolution();

wallpaper_op_ = new WallpaperOperation(index, resolution);
wallpaper_loader_ = new WallpaperLoader(info);
base::WorkerPool::PostTaskAndReply(
FROM_HERE,
base::Bind(&WallpaperOperation::Run, wallpaper_op_),
base::Bind(&WallpaperLoader::LoadOnWorkerPoolThread, wallpaper_loader_),
base::Bind(&DesktopBackgroundController::OnWallpaperLoadCompleted,
weak_ptr_factory_.GetWeakPtr(),
wallpaper_op_),
wallpaper_loader_),
true /* task_is_slow */);
}

void DesktopBackgroundController::ReloadDefaultWallpaper() {
int index = current_wallpaper_->wallpaper_index;
current_wallpaper_.reset(NULL);
SetDefaultWallpaper(index);
}

void DesktopBackgroundController::SetCustomWallpaper(
const gfx::ImageSkia& wallpaper,
WallpaperLayout layout) {
Expand All @@ -240,16 +221,17 @@ void DesktopBackgroundController::SetCustomWallpaper(
return;
}

current_wallpaper_.reset(new WallpaperData(layout, wallpaper));
WallpaperInfo info = { -1, layout };
current_wallpaper_.reset(new WallpaperData(info, wallpaper));
FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_,
OnWallpaperDataChanged());
SetDesktopBackgroundImageMode();
}

void DesktopBackgroundController::CancelPendingWallpaperOperation() {
// Set canceled flag of previous request to skip unneeded loading.
if (wallpaper_op_.get())
wallpaper_op_->Cancel();
if (wallpaper_loader_.get())
wallpaper_loader_->Cancel();

// Cancel reply callback for previous request.
weak_ptr_factory_.InvalidateWeakPtrs();
Expand All @@ -270,14 +252,14 @@ void DesktopBackgroundController::CreateEmptyWallpaper() {

WallpaperResolution DesktopBackgroundController::GetAppropriateResolution() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
WallpaperResolution resolution = SMALL;
WallpaperResolution resolution = WALLPAPER_RESOLUTION_SMALL;
Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
for (Shell::RootWindowList::iterator iter = root_windows.begin();
iter != root_windows.end(); ++iter) {
gfx::Size root_window_size = (*iter)->GetHostSize();
if (root_window_size.width() > kSmallWallpaperMaxWidth ||
root_window_size.height() > kSmallWallpaperMaxHeight) {
resolution = LARGE;
resolution = WALLPAPER_RESOLUTION_LARGE;
}
}
return resolution;
Expand Down Expand Up @@ -312,15 +294,15 @@ void DesktopBackgroundController::SetDesktopBackgroundImageMode() {
}

void DesktopBackgroundController::OnWallpaperLoadCompleted(
scoped_refptr<WallpaperOperation> wo) {
current_wallpaper_.reset(wo->ReleaseWallpaperData());
scoped_refptr<WallpaperLoader> wl) {
current_wallpaper_.reset(wl->ReleaseWallpaperData());
FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_,
OnWallpaperDataChanged());

SetDesktopBackgroundImageMode();

DCHECK(wo.get() == wallpaper_op_.get());
wallpaper_op_ = NULL;
DCHECK(wl.get() == wallpaper_loader_.get());
wallpaper_loader_ = NULL;
}

void DesktopBackgroundController::NotifyAnimationFinished() {
Expand Down
Loading

0 comments on commit 0c3461a

Please sign in to comment.