#ifndef ASH_WALLPAPER_WALLPAPER_CONTROLLER_IMPL_H_
#define ASH_WALLPAPER_WALLPAPER_CONTROLLER_IMPL_H_
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "ash/ash_export.h"
#include "ash/login/login_screen_controller.h"
#include "ash/login/ui/login_data_dispatcher.h"
#include "ash/public/cpp/image_downloader.h"
#include "ash/public/cpp/image_util.h"
#include "ash/public/cpp/login_types.h"
#include "ash/public/cpp/session/session_observer.h"
#include "ash/public/cpp/tablet_mode_observer.h"
#include "ash/public/cpp/wallpaper/google_photos_wallpaper_params.h"
#include "ash/public/cpp/wallpaper/online_wallpaper_params.h"
#include "ash/public/cpp/wallpaper/wallpaper_controller.h"
#include "ash/public/cpp/wallpaper/wallpaper_info.h"
#include "ash/public/cpp/wallpaper/wallpaper_types.h"
#include "ash/shell_observer.h"
#include "ash/system/scheduled_feature/scheduled_feature.h"
#include "ash/wallpaper/google_photos_wallpaper_manager.h"
#include "ash/wallpaper/online_wallpaper_manager.h"
#include "ash/wallpaper/online_wallpaper_variant_info_fetcher.h"
#include "ash/wallpaper/sea_pen_wallpaper_manager.h"
#include "ash/wallpaper/wallpaper_blur_manager.h"
#include "ash/wallpaper/wallpaper_file_manager.h"
#include "ash/wallpaper/wallpaper_pref_manager.h"
#include "ash/wallpaper/wallpaper_time_of_day_scheduler.h"
#include "ash/wallpaper/wallpaper_utils/wallpaper_calculated_colors.h"
#include "ash/webui/common/mojom/sea_pen.mojom.h"
#include "ash/webui/personalization_app/mojom/personalization_app.mojom-forward.h"
#include "ash/wm/overview/overview_observer.h"
#include "base/containers/flat_map.h"
#include "base/files/file_path.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "base/timer/wall_clock_timer.h"
#include "components/account_id/account_id.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/user_manager/user_type.h"
#include "ui/compositor/compositor_lock.h"
#include "ui/display/display_observer.h"
#include "ui/display/manager/display_manager_observer.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/native_theme/native_theme.h"
#include "ui/native_theme/native_theme_observer.h"
namespace base {
class SequencedTaskRunner;
}
namespace display {
enum class TabletState;
}
namespace ash {
class OnlineWallpaperManager;
class WallpaperColorCalculator;
class WallpaperDailyRefreshScheduler;
class WallpaperDriveFsDelegate;
class WallpaperImageDownloader;
class WallpaperMetricsManager;
class WallpaperResizer;
class WallpaperWindowStateManager;
using CustomWallpaperElement = std::pair<base::FilePath, gfx::ImageSkia>;
using CustomWallpaperMap = std::map<AccountId, CustomWallpaperElement>;
class ASH_EXPORT WallpaperControllerImpl
: public WallpaperController,
public WallpaperPrefManager::Observer,
public display::DisplayManagerObserver,
public ShellObserver,
public LoginDataDispatcher::Observer,
public SessionObserver,
public display::DisplayObserver,
public OverviewObserver,
public ui::CompositorLockClient,
public ui::NativeThemeObserver,
public ScheduledFeature::CheckpointObserver {
public:
static std::unique_ptr<WallpaperControllerImpl> Create(
PrefService* local_state);
static void SetWallpaperPrefManagerForTesting(
std::unique_ptr<WallpaperPrefManager> pref_manager);
static void SetWallpaperImageDownloaderForTesting(
std::unique_ptr<WallpaperImageDownloader> image_downloader);
explicit WallpaperControllerImpl(
std::unique_ptr<WallpaperPrefManager> pref_manager,
std::unique_ptr<WallpaperImageDownloader> image_downloader);
WallpaperControllerImpl(const WallpaperControllerImpl&) = delete;
WallpaperControllerImpl& operator=(const WallpaperControllerImpl&) = delete;
~WallpaperControllerImpl() override;
base::FilePath GetCustomWallpaperPath(const std::string& sub_dir,
const std::string& wallpaper_files_id,
const std::string& file_name) const;
base::FilePath GetCustomWallpaperDir(const std::string& sub_dir) const;
SkColor GetKMeanColor() const;
std::optional<SkColor> GetCachedWallpaperColorForUser(
const AccountId& account_id,
bool should_use_k_means) const;
const std::optional<WallpaperCalculatedColors>& calculated_colors() const {
return calculated_colors_;
}
gfx::ImageSkia GetWallpaper() const;
WallpaperLayout GetWallpaperLayout() const;
WallpaperType GetWallpaperType() const;
base::TimeDelta animation_duration() const { return animation_duration_; }
bool ShouldShowInitialAnimation();
bool HasShownAnyWallpaper() const;
void MaybeClosePreviewWallpaper();
void ShowWallpaperImage(const gfx::ImageSkia& image,
WallpaperInfo info,
bool preview_mode,
bool is_override);
void UpdateWallpaperBlurForLockState(bool blur);
void RestoreWallpaperBlurForLockState(float blur);
bool ShouldApplyShield() const;
bool is_wallpaper_set() const { return !!current_wallpaper_.get(); }
bool SetUserWallpaperInfo(const AccountId& account_id,
const WallpaperInfo& info);
bool SetUserWallpaperInfo(const AccountId& account_id,
bool is_ephemeral,
const WallpaperInfo& info);
bool GetWallpaperFromCache(const AccountId& account_id,
gfx::ImageSkia* image);
bool GetPathFromCache(const AccountId& account_id, base::FilePath* path);
void AddFirstWallpaperAnimationEndCallback(base::OnceClosure callback,
aura::Window* window);
void StartDecodeFromPath(const AccountId& account_id,
const user_manager::UserType user_type,
const WallpaperInfo& info,
bool show_wallpaper,
const base::FilePath& wallpaper_path);
bool ShouldCalculateColors() const;
WallpaperBlurManager* blur_manager() { return blur_manager_.get(); }
void SetClient(WallpaperControllerClient* client) override;
void SetDriveFsDelegate(
std::unique_ptr<WallpaperDriveFsDelegate> drivefs_delegate) override;
bool CanSetUserWallpaper(const AccountId& account_id) const override;
void SetCustomWallpaper(const AccountId& account_id,
const base::FilePath& file_path,
WallpaperLayout layout,
bool preview_mode,
SetWallpaperCallback callback) override;
void SetDecodedCustomWallpaper(const AccountId& account_id,
const std::string& file_name,
WallpaperLayout layout,
bool preview_mode,
SetWallpaperCallback callback,
const std::string& file_path,
const gfx::ImageSkia& image) override;
void SetOnlineWallpaper(const OnlineWallpaperParams& params,
SetWallpaperCallback callback) override;
void ShowOobeWallpaper() override;
bool IsOobeWallpaper() const;
void SetGooglePhotosWallpaper(const GooglePhotosWallpaperParams& params,
SetWallpaperCallback callback) override;
void SetGooglePhotosDailyRefreshAlbumId(const AccountId& account_id,
const std::string& album_id) override;
std::string GetGooglePhotosDailyRefreshAlbumId(
const AccountId& account_id) const override;
bool SetDailyGooglePhotosWallpaperIdCache(
const AccountId& account_id,
const DailyGooglePhotosIdCache& ids) override;
bool GetDailyGooglePhotosWallpaperIdCache(
const AccountId& account_id,
DailyGooglePhotosIdCache& ids_out) const override;
void SetTimeOfDayWallpaper(const AccountId& account_id,
SetTimeOfDayWallpaperCallback callback) override;
bool IsTimeOfDayWallpaper() const;
void SetDefaultWallpaper(const AccountId& account_id,
bool show_wallpaper,
SetWallpaperCallback callback) override;
base::FilePath GetDefaultWallpaperPath(
user_manager::UserType user_type) override;
void SetCustomizedDefaultWallpaperPaths(
const base::FilePath& customized_default_small_path,
const base::FilePath& customized_default_large_path) override;
void SetPolicyWallpaper(const AccountId& account_id,
user_manager::UserType user_type,
const std::string& data) override;
void SetDevicePolicyWallpaperPath(
const base::FilePath& device_policy_wallpaper_path) override;
bool SetThirdPartyWallpaper(const AccountId& account_id,
const std::string& file_name,
WallpaperLayout layout,
const gfx::ImageSkia& image) override;
void SetSeaPenWallpaper(const AccountId& account_id,
uint32_t image_id,
bool preview_mode,
SetWallpaperCallback callback) override;
void ConfirmPreviewWallpaper() override;
void CancelPreviewWallpaper() override;
void UpdateCurrentWallpaperLayout(const AccountId& account_id,
WallpaperLayout layout) override;
void ShowUserWallpaper(const AccountId& account_id) override;
void ShowUserWallpaper(const AccountId& account_id,
const user_manager::UserType user_type) override;
void ShowSigninWallpaper() override;
void ShowOneShotWallpaper(const gfx::ImageSkia& image) override;
void ShowOverrideWallpaper(const base::FilePath& image_path,
bool always_on_top) override;
void RemoveOverrideWallpaper() override;
void RemoveUserWallpaper(const AccountId& account_id,
base::OnceClosure on_removed) override;
void RemovePolicyWallpaper(const AccountId& account_id) override;
void SetAnimationDuration(base::TimeDelta animation_duration) override;
void OpenWallpaperPickerIfAllowed() override;
void MinimizeInactiveWindows(const std::string& user_id_hash) override;
void RestoreMinimizedWindows(const std::string& user_id_hash) override;
void AddObserver(WallpaperControllerObserver* observer) override;
void RemoveObserver(WallpaperControllerObserver* observer) override;
gfx::ImageSkia GetWallpaperImage() override;
void LoadPreviewImage(LoadPreviewImageCallback callback) override;
bool IsWallpaperBlurredForLockState() const override;
bool IsActiveUserWallpaperControlledByPolicy() override;
bool IsWallpaperControlledByPolicy(
const AccountId& account_id) const override;
std::optional<WallpaperInfo> GetActiveUserWallpaperInfo() const override;
std::optional<WallpaperInfo> GetWallpaperInfoForAccountId(
const AccountId& account_id) const override;
void SetDailyRefreshCollectionId(const AccountId& account_id,
const std::string& collection_id) override;
std::string GetDailyRefreshCollectionId(
const AccountId& account_id) const override;
void UpdateDailyRefreshWallpaper(
RefreshWallpaperCallback callback = base::DoNothing()) override;
void SyncLocalAndRemotePrefs(const AccountId& account_id) override;
const AccountId& CurrentAccountId() const override;
void OnDeviceWallpaperImageFilePathUpdated(
const base::FilePath& path) override;
void OnDidApplyDisplayChanges() override;
void OnRootWindowAdded(aura::Window* root_window) override;
void OnShellInitialized() override;
void OnShellDestroying() override;
void OnOobeDialogStateChanged(OobeDialogState state) override;
void OnSessionStateChanged(session_manager::SessionState state) override;
void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;
void OnActiveUserSessionChanged(const AccountId& account_id) override;
void OnDisplayTabletStateChanged(display::TabletState state) override;
void OnCheckpointChanged(const ScheduledFeature* src,
const ScheduleCheckpoint new_checkpoint) override;
void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
void OnOverviewModeWillStart() override;
void OnOverviewModeStarting() override;
void OnOverviewModeEnded() override;
void CompositorLockTimedOut() override;
void ShowDefaultWallpaperForTesting();
void CreateEmptyWallpaperForTesting();
void set_wallpaper_reload_no_delay_for_test() {
wallpaper_reload_delay_ = base::Milliseconds(0);
}
void ReloadWallpaperForTesting(bool clear_cache);
void OverrideDriveFsDelegateForTesting(
std::unique_ptr<WallpaperDriveFsDelegate> drivefs_delegate);
void set_bypass_decode_for_testing() { bypass_decode_for_testing_ = true; }
void set_allow_shield_for_testing() { allow_shield_for_testing_ = true; }
WallpaperDriveFsDelegate* drivefs_delegate_for_testing() {
return drivefs_delegate_.get();
}
WallpaperImageDownloader* wallpaper_image_downloader_for_testing() {
return wallpaper_image_downloader_.get();
}
raw_ptr<WallpaperDailyRefreshScheduler>
daily_refresh_scheduler_for_testing() {
return daily_refresh_scheduler_.get();
}
raw_ptr<WallpaperTimeOfDayScheduler> time_of_day_scheduler_for_testing() {
return time_of_day_scheduler_.get();
}
raw_ptr<WallpaperPrefManager> pref_manager_for_testing() {
return pref_manager_.get();
}
private:
friend class WallpaperControllerTestBase;
friend class WallpaperControllerTestApi;
enum WallpaperMode { WALLPAPER_NONE, WALLPAPER_IMAGE };
struct CachedDefaultWallpaper {
gfx::ImageSkia image;
base::FilePath file_path;
};
void OnWallpaperResized();
bool GetUserWallpaperInfo(const AccountId& account_id,
WallpaperInfo* info) const;
void UpdateWallpaperForRootWindow(aura::Window* root_window,
bool lock_state_changed,
bool new_root);
void UpdateWallpaperForAllRootWindows(bool lock_state_changed);
bool ReparentWallpaper();
int GetWallpaperContainerId();
void RemoveUserWallpaperImpl(const AccountId& account_id,
base::OnceClosure on_removed);
void RemoveUserWallpaperImplWithFilesId(
const AccountId& account_id,
base::OnceClosure on_removed,
const std::string& wallpaper_files_id);
void SetDefaultWallpaperImpl(user_manager::UserType user_type,
bool show_wallpaper,
SetWallpaperCallback callback);
bool WallpaperIsAlreadyLoaded(const gfx::ImageSkia& image,
bool compare_layouts,
WallpaperLayout layout) const;
void ReadAndDecodeWallpaper(image_util::DecodeImageCallback callback,
const base::FilePath& file_path);
bool SetDefaultWallpaperInfo(const AccountId& account_id,
const base::Time& date);
void OnWallpaperVariantsFetched(WallpaperType type,
SetWallpaperCallback callback,
std::optional<OnlineWallpaperParams> params);
void RepaintOnlineWallpaper(std::optional<OnlineWallpaperParams> params);
void OnOnlineWallpaperDecoded(const AccountId& account_id,
bool preview_mode,
WallpaperInfo wallpaper_info,
SetWallpaperCallback callback,
const gfx::ImageSkia& image);
void OnGetCustomizationIdForOobe(
std::optional<std::string_view> customization_id);
void OnOobeWallpaperDecoded(const base::FilePath& path,
const gfx::ImageSkia& image);
void OnGooglePhotosPhotoFetched(
GooglePhotosWallpaperParams params,
SetWallpaperCallback callback,
ash::personalization_app::mojom::GooglePhotosPhotoPtr photo,
bool success);
void OnDailyGooglePhotosPhotoFetched(
const GooglePhotosWallpaperParams& params,
RefreshWallpaperCallback callback,
ash::personalization_app::mojom::GooglePhotosPhotoPtr photo,
bool success);
void OnDailyGooglePhotosWallpaperDecoded(const AccountId& account_id,
const std::string& photo_id,
const std::string& album_id,
std::optional<std::string> dedup_key,
RefreshWallpaperCallback callback,
const gfx::ImageSkia& image);
void OnGooglePhotosWallpaperDecoded(const GooglePhotosWallpaperParams& params,
SetWallpaperCallback callback,
const gfx::ImageSkia& image);
void SetWallpaperImpl(const AccountId& account_id,
const WallpaperInfo& wallpaper_info,
const gfx::ImageSkia& image,
bool show_wallpaper);
void SetWallpaperFromInfo(const AccountId& account_id,
const WallpaperInfo& info);
void OnDefaultWallpaperDecoded(const base::FilePath& path,
WallpaperLayout layout,
bool show_wallpaper,
SetWallpaperCallback callback,
const gfx::ImageSkia& image);
void OnSeaPenWallpaperDecoded(const AccountId& account_id,
uint32_t sea_pen_image_id,
bool preview_mode,
SetWallpaperCallback callback,
const gfx::ImageSkia& image_skia);
void OnSeaPenWallpaperSavedToPublic(const AccountId& account_id,
const gfx::ImageSkia& image_skia,
uint32_t sea_pen_image_id,
bool preview_mode,
SetWallpaperCallback callback,
const base::FilePath& file_path);
void SaveAndSetWallpaper(const AccountId& account_id,
bool is_ephemeral,
const std::string& file_name,
const std::string& file_path,
WallpaperType type,
WallpaperLayout layout,
bool show_wallpaper,
const gfx::ImageSkia& image);
void SaveAndSetWallpaperWithCompletion(
const AccountId& account_id,
bool is_ephemeral,
const std::string& file_name,
const std::string& file_path,
WallpaperType type,
WallpaperLayout layout,
bool show_wallpaper,
const gfx::ImageSkia& image,
base::OnceCallback<void(const base::FilePath&)> image_saved_callback);
void SaveAndSetWallpaperWithCompletionFilesId(
const AccountId& account_id,
bool is_ephemeral,
const std::string& file_name,
const std::string& file_path,
WallpaperType type,
WallpaperLayout layout,
bool show_wallpaper,
const gfx::ImageSkia& image,
base::OnceCallback<void(const base::FilePath&)> image_saved_callback,
const std::string& wallpaper_files_id);
void OnWallpaperDecoded(const AccountId& account_id,
const base::FilePath& path,
const WallpaperInfo& info,
bool show_wallpaper,
const gfx::ImageSkia& image);
void ReloadWallpaper(bool clear_cache);
void SetCalculatedColors(const WallpaperCalculatedColors& calculated_colors);
void ResetCalculatedColors();
void CalculateWallpaperColors();
void OnColorCalculationComplete(const WallpaperInfo& info,
const WallpaperCalculatedColors& colors);
void OnOverrideWallpaperDecoded(const WallpaperInfo& info,
const gfx::ImageSkia& image);
bool IsDevicePolicyWallpaper() const;
bool IsOneShotWallpaper() const;
void OnPolicyWallpaperDecoded(const AccountId& account_id,
user_manager::UserType user_type,
bool show_image,
const gfx::ImageSkia& image);
bool ShouldSetDevicePolicyWallpaper() const;
void SetDevicePolicyWallpaper();
void OnDevicePolicyWallpaperDecoded(const gfx::ImageSkia& image);
void GetInternalDisplayCompositorLock();
void RepaintWallpaper();
void HandleWallpaperInfoSyncedIn(const AccountId& account_id,
const WallpaperInfo& info);
void OnGetCustomizationIdForTimeOfDayWallpaper(
const AccountId& account_id,
SetTimeOfDayWallpaperCallback set_time_of_day_wallpaper_callback,
std::optional<std::string_view> customization_id);
void OnTimeOfDayWallpaperSetAfterOobe(uint64_t unit_id, bool success);
void OnDailyRefreshWallpaperUpdated(RefreshWallpaperCallback callback,
bool success);
bool IsDailyRefreshEnabled() const;
bool IsDailyGooglePhotosWallpaperSelected();
bool IsGooglePhotosWallpaperSet() const;
base::FilePath GetUserGooglePhotosWallpaperDir(
const AccountId& account_id) const;
base::FilePath GetUserSeaPenWallpaperDir(const AccountId& account_id) const;
void CheckGooglePhotosStaleness(const AccountId& account_id,
const WallpaperInfo& info);
void HandleGooglePhotosStalenessCheck(
const AccountId& account_id,
ash::personalization_app::mojom::GooglePhotosPhotoPtr photo,
bool success);
void SaveWallpaperToDriveFsAndSyncInfo(const AccountId& account_id,
const base::FilePath& origin_path);
void WallpaperSavedToDriveFS(const AccountId& account_id, bool success);
void HandleCustomWallpaperInfoSyncedIn(const AccountId& account_id,
const WallpaperInfo& info);
void OnDriveFsWallpaperChange(const AccountId& account_id, bool success);
void OnGetDriveFsWallpaperModificationTime(
const AccountId& account_id,
const WallpaperInfo& wallpaper_info,
base::Time modification_time);
void HandleDailyWallpaperInfoSyncedIn(const AccountId& account_id,
const WallpaperInfo& info);
void HandleGooglePhotosWallpaperInfoSyncedIn(const AccountId& account_id,
const WallpaperInfo& info);
void HandleSettingOnlineWallpaperFromWallpaperInfo(
const AccountId& account_id,
const WallpaperInfo& info);
void CleanUpBeforeSettingUserWallpaperInfo(const AccountId& account_id,
const WallpaperInfo& info);
bool IsOobeState() const;
const ScheduledFeature& GetScheduleForOnlineWallpaper(
const std::string& collection_id) const;
bool is_session_active_ = false;
OobeDialogState oobe_state_ = OobeDialogState::HIDDEN;
WallpaperMode wallpaper_mode_ = WALLPAPER_NONE;
raw_ptr<WallpaperControllerClient> wallpaper_controller_client_ = nullptr;
base::ObserverList<WallpaperControllerObserver>::Unchecked observers_;
std::unique_ptr<WallpaperMetricsManager> wallpaper_metrics_manager_;
std::unique_ptr<WallpaperResizer> current_wallpaper_;
std::unique_ptr<WallpaperPrefManager> pref_manager_;
std::unique_ptr<WallpaperDriveFsDelegate> drivefs_delegate_;
std::unique_ptr<WallpaperColorCalculator> color_calculator_;
std::unique_ptr<WallpaperWindowStateManager> window_state_manager_;
OnlineWallpaperVariantInfoFetcher variant_info_fetcher_;
const std::unique_ptr<WallpaperBlurManager> blur_manager_;
std::optional<WallpaperCalculatedColors> calculated_colors_;
AccountId current_account_id_;
CustomWallpaperMap wallpaper_cache_map_;
CachedDefaultWallpaper cached_default_wallpaper_;
CachedDefaultWallpaper cached_oobe_wallpaper_;
base::FilePath wallpapers_dir_;
base::FilePath custom_wallpapers_dir_;
base::FilePath google_photos_wallpapers_dir_;
base::FilePath sea_pen_wallpaper_dir_;
base::FilePath customized_default_small_path_;
base::FilePath customized_default_large_path_;
gfx::Size current_max_display_size_;
base::OneShotTimer timer_;
base::TimeDelta wallpaper_reload_delay_;
base::TimeDelta animation_duration_;
base::FilePath device_policy_wallpaper_path_;
bool is_first_wallpaper_ = false;
bool is_always_on_top_wallpaper_ = false;
bool is_override_wallpaper_ = false;
const std::unique_ptr<WallpaperImageDownloader> wallpaper_image_downloader_;
const std::unique_ptr<WallpaperFileManager> wallpaper_file_manager_;
OnlineWallpaperManager online_wallpaper_manager_;
GooglePhotosWallpaperManager google_photos_wallpaper_manager_;
SeaPenWallpaperManager sea_pen_wallpaper_manager_;
std::unique_ptr<WallpaperDailyRefreshScheduler> daily_refresh_scheduler_;
std::unique_ptr<WallpaperTimeOfDayScheduler> time_of_day_scheduler_;
scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_;
ScopedSessionObserver scoped_session_observer_{this};
base::ScopedObservation<ui::NativeTheme, ui::NativeThemeObserver>
theme_observation_{this};
base::ScopedObservation<ScheduledFeature,
ScheduledFeature::CheckpointObserver>
daily_refresh_observation_{this};
base::ScopedObservation<ScheduledFeature,
ScheduledFeature::CheckpointObserver>
time_of_day_scheduler_observation_{this};
display::ScopedDisplayObserver display_observer_{this};
std::unique_ptr<ui::CompositorLock> compositor_lock_;
std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
base::OnceClosure confirm_preview_wallpaper_callback_;
base::RepeatingClosure reload_preview_wallpaper_callback_;
base::RepeatingClosure reload_override_wallpaper_callback_;
bool bypass_decode_for_testing_ = false;
int wallpaper_count_for_testing_ = 0;
bool allow_blur_for_testing_ = false;
bool allow_shield_for_testing_ = false;
std::vector<base::FilePath> decode_requests_for_testing_;
base::ScopedObservation<WallpaperPrefManager, WallpaperPrefManager::Observer>
pref_manager_observation_{this};
base::WeakPtrFactory<WallpaperControllerImpl> weak_factory_{this};
base::WeakPtrFactory<WallpaperControllerImpl> set_wallpaper_weak_factory_{
this};
};
}
#endif