Index: chrome/browser/chromeos/arc/arc_wallpaper_service.cc |
diff --git a/chrome/browser/chromeos/arc/arc_wallpaper_handler.cc b/chrome/browser/chromeos/arc/arc_wallpaper_service.cc |
similarity index 57% |
rename from chrome/browser/chromeos/arc/arc_wallpaper_handler.cc |
rename to chrome/browser/chromeos/arc/arc_wallpaper_service.cc |
index 238a9837e121ffe019e3e1076c9429b7ff177420..271a2e540731983ed1f0cb7f2cbd8da309a2cfa6 100644 |
--- a/chrome/browser/chromeos/arc/arc_wallpaper_handler.cc |
+++ b/chrome/browser/chromeos/arc/arc_wallpaper_service.cc |
@@ -2,21 +2,28 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/chromeos/arc/arc_wallpaper_handler.h" |
+#include "chrome/browser/chromeos/arc/arc_wallpaper_service.h" |
#include <string> |
#include <utility> |
#include <vector> |
+#include "ash/shell.h" |
+#include "ash/wallpaper/wallpaper_controller.h" |
#include "base/logging.h" |
#include "base/memory/ptr_util.h" |
+#include "base/task_runner_util.h" |
#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" |
+#include "components/arc/arc_bridge_service.h" |
#include "components/signin/core/account_id/account_id.h" |
#include "components/user_manager/user_manager.h" |
#include "components/wallpaper/wallpaper_files_id.h" |
#include "components/wallpaper/wallpaper_layout.h" |
#include "content/public/browser/browser_thread.h" |
+#include "ui/gfx/codec/png_codec.h" |
+#include "ui/gfx/image/image.h" |
#include "ui/gfx/image/image_skia.h" |
+#include "ui/gfx/image/image_util.h" |
using user_manager::UserManager; |
@@ -56,18 +63,59 @@ void SetBitmapAsWallpaper(const SkBitmap& bitmap) { |
// wallpaper_private_api.cc. |
} |
+std::vector<uint8_t> EncodeImagePNG(const gfx::ImageSkia image) { |
+ std::vector<uint8_t> result; |
+ gfx::PNGCodec::FastEncodeBGRASkBitmap(*image.bitmap(), true, &result); |
+ return result; |
+} |
+ |
} // namespace |
-ArcWallpaperHandler::ArcWallpaperHandler() = default; |
+ArcWallpaperService::ArcWallpaperService(ArcBridgeService* bridge_service) |
+ : ArcService(bridge_service), binding_(this) { |
+ arc_bridge_service()->wallpaper()->AddObserver(this); |
+} |
-ArcWallpaperHandler::~ArcWallpaperHandler() { |
+ArcWallpaperService::~ArcWallpaperService() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
// Make sure the callback is never called after destruction. It is safe to |
// call Cancel() even when there is no in-flight request. |
ImageDecoder::Cancel(this); |
+ arc_bridge_service()->wallpaper()->RemoveObserver(this); |
+} |
+ |
+void ArcWallpaperService::OnInstanceReady() { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ mojom::WallpaperInstance* wallpaper_instance = |
+ arc_bridge_service()->wallpaper()->instance(); |
+ if (!wallpaper_instance) { |
+ LOG(ERROR) << "OnWallpaperInstanceReady called, " |
+ << "but no wallpaper instance found"; |
+ return; |
+ } |
+ wallpaper_instance->Init(binding_.CreateInterfacePtrAndBind()); |
+} |
+ |
+void ArcWallpaperService::SetWallpaper(mojo::Array<uint8_t> png_data) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ ImageDecoder::Cancel(this); |
+ ImageDecoder::StartWithOptions(this, std::move(png_data.PassStorage()), |
Luis Héctor Chávez
2016/09/02 16:23:47
|png_data.PassStorage()| is already an rvalue, the
Luis Héctor Chávez
2016/09/06 20:05:46
ping on the removal of this std::move().
Muyuan
2016/09/06 23:37:59
done.
sry for overlooking it.
|
+ ImageDecoder::ROBUST_PNG_CODEC, true); |
+} |
+ |
+void ArcWallpaperService::GetWallpaper( |
+ const base::Callback<void(mojo::Array<uint8_t>)>& callback) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ ash::WallpaperController* wc = |
+ ash::Shell::GetInstance()->wallpaper_controller(); |
+ gfx::ImageSkia wallpaper = wc->GetWallpaper(); |
+ base::PostTaskAndReplyWithResult( |
+ content::BrowserThread::GetBlockingPool(), FROM_HERE, |
+ base::Bind(&EncodeImagePNG, wallpaper), callback); |
} |
-void ArcWallpaperHandler::SetWallpaper(std::vector<uint8_t> jpeg_data) { |
+void ArcWallpaperService::SetWallpaperJPEG( |
+ const std::vector<uint8_t>& jpeg_data) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
// If there is an in-flight request, cancel it. It is safe to call Cancel() |
// even when there is no in-flight request. |
@@ -76,12 +124,12 @@ void ArcWallpaperHandler::SetWallpaper(std::vector<uint8_t> jpeg_data) { |
ImageDecoder::ROBUST_JPEG_CODEC, true); |
} |
-void ArcWallpaperHandler::OnImageDecoded(const SkBitmap& bitmap) { |
+void ArcWallpaperService::OnImageDecoded(const SkBitmap& bitmap) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
SetBitmapAsWallpaper(bitmap); |
} |
-void ArcWallpaperHandler::OnDecodeImageFailed() { |
+void ArcWallpaperService::OnDecodeImageFailed() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
LOG(ERROR) << "Failed to decode wallpaper image."; |
} |