1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
ash / public / cpp / wallpaper / wallpaper_controller.h [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_PUBLIC_CPP_WALLPAPER_WALLPAPER_CONTROLLER_H_
#define ASH_PUBLIC_CPP_WALLPAPER_WALLPAPER_CONTROLLER_H_
#include <cstdint>
#include <optional>
#include <string>
#include "ash/public/cpp/ash_public_export.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/sea_pen_image.h"
#include "ash/public/cpp/wallpaper/wallpaper_info.h"
#include "ash/public/cpp/wallpaper/wallpaper_types.h"
#include "ash/webui/common/mojom/sea_pen.mojom-forward.h"
#include "base/containers/lru_cache.h"
#include "base/files/file_path.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/ref_counted_memory.h"
#include "base/time/time.h"
#include "components/user_manager/user_type.h"
class AccountId;
namespace gfx {
class ImageSkia;
}
namespace ash {
class WallpaperControllerObserver;
class WallpaperControllerClient;
class WallpaperDriveFsDelegate;
// Used by Chrome to set the wallpaper displayed by ash.
class ASH_PUBLIC_EXPORT WallpaperController {
public:
// A callback for confirming if Set*Wallpaper operations completed
// successfully.
using SetWallpaperCallback = base::OnceCallback<void(bool success)>;
using DailyGooglePhotosIdCache = base::HashingLRUCacheSet<uint32_t>;
using LoadPreviewImageCallback =
base::OnceCallback<void(scoped_refptr<base::RefCountedMemory>)>;
WallpaperController();
virtual ~WallpaperController();
static WallpaperController* Get();
// Sets the client interface, used to show the wallpaper picker, etc.
virtual void SetClient(WallpaperControllerClient* client) = 0;
virtual void SetDriveFsDelegate(
std::unique_ptr<WallpaperDriveFsDelegate> drivefs_delegate) = 0;
// Sets paths for wallpaper directories and the device policy wallpaper path.
// |user_data|: Directory where user data can be written.
// |wallpapers|: Directory where downloaded chromeos wallpapers reside.
// |custom_wallpapers|: Directory where custom wallpapers reside.
// |device_policy_wallpaper|: Path of the device policy wallpaper (if any).
virtual void Init(const base::FilePath& user_data,
const base::FilePath& wallpapers,
const base::FilePath& custom_wallpapers,
const base::FilePath& device_policy_wallpaper) = 0;
// Whether the user with `account_id` can set wallpaper. Users may be
// disallowed from setting wallpaper based on enterprise policy or if the
// device is running in kiosk mode.
virtual bool CanSetUserWallpaper(const AccountId& account_id) const = 0;
// Sets the wallpaper from a local file and updates the saved wallpaper info
// for the user.
// |account_id|: The user's account id.
// |file_path|: The path of the image file to read.
// |layout|: The layout of the wallpaper, used for wallpaper resizing.
// |preview_mode|: If true, show the wallpaper immediately but doesn't change
// the user wallpaper info until |ConfirmPreviewWallpaper| is
// called.
// |callback|: Called when the image is set.
virtual void SetCustomWallpaper(const AccountId& account_id,
const base::FilePath& file_path,
WallpaperLayout layout,
bool preview_mode,
SetWallpaperCallback callback) = 0;
// Sets wallpaper from a local file and updates the saved wallpaper info for
// the user.
// |account_id|: The user's account id.
// |file_name|: The name of the wallpaper file.
// |layout|: The layout of the wallpaper, used for wallpaper resizing.
// |preview_mode|: If true, show the wallpaper immediately but doesn't change
// the user wallpaper info until |ConfirmPreviewWallpaper| is
// called.
// |callback|: Called when the wallpaper is set.
// |file_path| The path of the image file to read.
// |image|: The wallpaper image.
virtual 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) = 0;
// Sets the wallpaper at |params.asset_id|, |params.url| and
// |params.collection_id| as the active wallpaper for the user at
// |params.account_id|. The first time this is called, will download the
// wallpaper and cache on disk. Subsequent calls with the same url will use
// the stored wallpaper. If |params.preview_mode| is true, the visible
// background wallpaper will change, but that change will not be persisted in
// preferences. Call |ConfirmPreviewMode| or |CancelPreviewMode| to finalize.
// |callback| is required and will be called after the image is fetched (from
// network or disk) and decoded.
virtual void SetOnlineWallpaper(const OnlineWallpaperParams& params,
SetWallpaperCallback callback) = 0;
// Used to select, load, and show the OOBE wallpaper
virtual void ShowOobeWallpaper() = 0;
// Sets the Google Photos photo with id |params.id| as the active wallpaper.
virtual void SetGooglePhotosWallpaper(
const GooglePhotosWallpaperParams& params,
SetWallpaperCallback callback) = 0;
// Sets and stores the collection id used to refresh Google Photos wallpapers.
// `album_id` is empty if daily refresh is not enabled.
virtual void SetGooglePhotosDailyRefreshAlbumId(
const AccountId& account_id,
const std::string& album_id) = 0;
// Get the Google Photos daily refresh album id. Empty if
// `current_wallpaper_.type` is not `kDailyGooglePhotos`
virtual std::string GetGooglePhotosDailyRefreshAlbumId(
const AccountId& account_id) const = 0;
// Set and get the cache of hashed ids for recently shown daily Google Photos.
// This cache is persisted in local preferences, and is not synced across
// devices.
virtual bool SetDailyGooglePhotosWallpaperIdCache(
const AccountId& account_id,
const DailyGooglePhotosIdCache& ids) = 0;
virtual bool GetDailyGooglePhotosWallpaperIdCache(
const AccountId& account_id,
DailyGooglePhotosIdCache& ids_out) const = 0;
// Downloads and sets a time of day wallpaper to be the active wallpaper.
// |acount_id|: The user's account id.
// |callback|: Called with a boolean to indicate success when the wallpaper is
// fetched and decoded.
virtual void SetTimeOfDayWallpaper(const AccountId& account_id,
SetWallpaperCallback callback) = 0;
// Sets the user's wallpaper to be the default wallpaper. Note: different user
// types may have different default wallpapers.
// |account_id|: The user's account id.
// |show_wallpaper|: If false, don't show the new wallpaper now but only
// update cache.
// |callback|: Called with a boolean to indicate success when the default
// wallpaper is read and decoded.
virtual void SetDefaultWallpaper(const AccountId& account_id,
bool show_wallpaper,
SetWallpaperCallback callback) = 0;
// Get the path to the default wallpaper file for the |user_type|. Will be
// empty if this user/device has no recommended default wallpaper.
virtual base::FilePath GetDefaultWallpaperPath(
user_manager::UserType user_type) = 0;
// Sets the paths of the customized default wallpaper to be used wherever a
// default wallpaper is needed. If a default wallpaper is being shown, updates
// the screen to replace the old default wallpaper. Note: it doesn't change
// the default wallpaper for guest and child accounts.
// |customized_default_small_path|: The file path of the small-size customized
// default wallpaper, if any.
// |customized_default_large_path|: The file path of the large-size customized
// default wallpaper, if any.
virtual void SetCustomizedDefaultWallpaperPaths(
const base::FilePath& customized_default_small_path,
const base::FilePath& customized_default_large_path) = 0;
// Sets wallpaper from policy. If the user has logged in, show the policy
// wallpaper immediately, otherwise, the policy wallpaper will be shown the
// next time |ShowUserWallpaper| is called. Note: it is different from device
// policy. This function may be called on the login screen, thus it's
// responsibility of the caller to provide the correct |user_type| for such
// case i.e. |user_type| should be derived by using
// |user_manager::UserManager|.
// |account_id|: The user's account id.
// |user_type|: The type of user.
// |data|: The data used to decode the image.
virtual void SetPolicyWallpaper(const AccountId& account_id,
user_manager::UserType user_type,
const std::string& data) = 0;
// Sets the path of device policy wallpaper.
// |device_policy_wallpaper_path|: The file path of the device policy
// wallpaper if it was set or empty value if
// it was cleared.
virtual void SetDevicePolicyWallpaperPath(
const base::FilePath& device_policy_wallpaper_path) = 0;
// Sets wallpaper from a third-party app (as opposed to the Chrome OS
// wallpaper picker). Chrome extensions and Arc++ call this function.
// |account_id|: The user's account id.
// |wallpaper_files_id|: The file id for |account_id|.
// |file_name|: The name of the wallpaper file.
// |layout|: The layout of the wallpaper, used for wallpaper resizing.
// |image|: The wallpaper image.
// Returns if the wallpaper is allowed to be shown on screen. It's false if:
// 1) the user is not permitted to change wallpaper, or
// 2) updating the on-screen wallpaper is not allowed at the given moment.
virtual bool SetThirdPartyWallpaper(const AccountId& account_id,
const std::string& file_name,
WallpaperLayout layout,
const gfx::ImageSkia& image) = 0;
// Sets `image_id` as system wallpaper for user with `account_id`. A
// corresponding image with id `image_id` is expected to be present on disk
// and will be loaded via SeaPenWallpaperManager. Calls `callback` with
// boolean success. Can fail if `account_id` is not allowed to set wallpaper,
// or the image failed to decode.
virtual void SetSeaPenWallpaper(const AccountId& account_id,
uint32_t image_id,
bool preview_mode,
SetWallpaperCallback callback) = 0;
// Confirms the wallpaper being previewed to be set as the actual user
// wallpaper. Must be called in preview mode.
virtual void ConfirmPreviewWallpaper() = 0;
// Cancels the wallpaper preview and reverts to the user wallpaper. Must be
// called in preview mode.
virtual void CancelPreviewWallpaper() = 0;
// Updates the layout for the user's current wallpaper and reloads the
// wallpaper with the new layout. Note that only custom and Google Photos
// wallpaper types are currently supported.
// |account_id|: The user's account id.
// |layout|: The new layout of the wallpaper.
virtual void UpdateCurrentWallpaperLayout(const AccountId& account_id,
WallpaperLayout layout) = 0;
// Shows the user's wallpaper, which is determined in the following order:
// 1) Use device policy wallpaper if it exists AND we are at the login screen.
// 2) Use user policy wallpaper if it exists.
// 3) Use the wallpaper set by the user (either by |SetOnlineWallpaper| or
// |SetCustomWallpaper|), if any.
// 4) Use the default wallpaper of this user.
virtual void ShowUserWallpaper(const AccountId& account_id) = 0;
// Shows the user's wallpaper but uses |user_type| to determine default
// wallpaper if necessary. This is intendend for use where users are not
// yet logged in (i.e. login screen).
virtual void ShowUserWallpaper(const AccountId& account_id,
const user_manager::UserType user_type) = 0;
// Used by the gaia-signin UI. Signin wallpaper is considered either as the
// device policy wallpaper or the default wallpaper.
virtual void ShowSigninWallpaper() = 0;
// Shows a one-shot wallpaper, which does not belong to any particular user
// and is not saved to file. Note: the wallpaper will never be dimmed or
// blurred because it's assumed that the caller wants to show the image as is
// when using this method.
virtual void ShowOneShotWallpaper(const gfx::ImageSkia& image) = 0;
// Shows an override wallpaper instead of the wallpaper that would normally be
// shown. All other wallpaper requests are ignored when the override wallpaper
// is being shown.
// |image_path|: The file path to read the image data from.
// |always_on_top|: Whether the override wallpaper should be shown on top of
// everything except for the power off animation.
virtual void ShowOverrideWallpaper(const base::FilePath& image_path,
bool always_on_top) = 0;
// Removes the override wallpaper. The wallpaper will revert to the previous
// one, or a default one if there was none. No-op if the current wallpaper is
// not overridden.
virtual void RemoveOverrideWallpaper() = 0;
// Removes all of the user's saved wallpapers and related info.
// |account_id|: The user's account id.
virtual void RemoveUserWallpaper(const AccountId& account_id,
base::OnceClosure on_removed) = 0;
// Removes all of the user's saved wallpapers and related info if the
// wallpaper was set by |SetPolicyWallpaper|. In addition, sets the user's
// wallpaper to be the default. If the user has logged in, show the default
// wallpaper immediately, otherwise, the default wallpaper will be shown the
// next time |ShowUserWallpaper| is called.
// |account_id|: The user's account id.
virtual void RemovePolicyWallpaper(const AccountId& account_id) = 0;
// Sets wallpaper animation duration. Passing an empty value disables the
// animation.
virtual void SetAnimationDuration(base::TimeDelta animation_duration) = 0;
// Opens the wallpaper picker if the active user is not controlled by policy
// and it's allowed to change wallpaper per the user type and the login state.
virtual void OpenWallpaperPickerIfAllowed() = 0;
// Minimizes all windows except the active window.
// |user_id_hash|: The hash value corresponding to |User::username_hash|.
virtual void MinimizeInactiveWindows(const std::string& user_id_hash) = 0;
// Restores all minimized windows to their previous states. This should only
// be called after calling |MinimizeInactiveWindows|.
// |user_id_hash|: The hash value corresponding to |User::username_hash|.
virtual void RestoreMinimizedWindows(const std::string& user_id_hash) = 0;
// Add and remove wallpaper observers.
virtual void AddObserver(WallpaperControllerObserver* observer) = 0;
virtual void RemoveObserver(WallpaperControllerObserver* observer) = 0;
// Returns the wallpaper image currently being shown.
virtual gfx::ImageSkia GetWallpaperImage() = 0;
// Loads the preview image of the currently shown wallpaper. Callback is
// called after the operation completes.
virtual void LoadPreviewImage(LoadPreviewImageCallback callback) = 0;
// Returns whether the current wallpaper is blurred on lock/login screen.
virtual bool IsWallpaperBlurredForLockState() const = 0;
// Returns true if the wallpaper of the currently active user (if any) is
// controlled by policy (excluding device policy). If there's no active user,
// returns false.
virtual bool IsActiveUserWallpaperControlledByPolicy() = 0;
// Returns true if the wallpaper of the user with the given |account_id| is
// controlled by policy (excluding device policy). If the |account_id| is
// invalid, returns false.
virtual bool IsWallpaperControlledByPolicy(
const AccountId& account_id) const = 0;
// Returns active user's `WallpaperInfo` if there is an active user that has
// valid `WallpaperInfo`.
virtual std::optional<WallpaperInfo> GetActiveUserWallpaperInfo() const = 0;
// Returns a `WallpaperInfo` for the given `account_id` if `account_id` exists
// and has valid saved info.
virtual std::optional<WallpaperInfo> GetWallpaperInfoForAccountId(
const AccountId& account_id) const = 0;
// Set and store the collection id used to update refreshable wallpapers.
// Empty if daily refresh is not enabled.
virtual void SetDailyRefreshCollectionId(
const AccountId& account_id,
const std::string& collection_id) = 0;
// Get the daily refresh collection id. Empty if daily refresh is not enabled;
virtual std::string GetDailyRefreshCollectionId(
const AccountId& account_id) const = 0;
// With daily refresh enabled, this updates the wallpaper by asking for a
// wallpaper from within the user specified collection.
using RefreshWallpaperCallback = base::OnceCallback<void(bool success)>;
virtual void UpdateDailyRefreshWallpaper(
RefreshWallpaperCallback callback = base::DoNothing()) = 0;
// Sync wallpaper infos and images.
// |account_id|: The account id of the user.
virtual void SyncLocalAndRemotePrefs(const AccountId& account_id) = 0;
// The `AccountId` for the user whose wallpaper is currently displayed. May be
// empty `AccountId` for things like OOBE and device policy wallpaper.
virtual const AccountId& CurrentAccountId() const = 0;
};
} // namespace ash
#endif // ASH_PUBLIC_CPP_WALLPAPER_WALLPAPER_CONTROLLER_H_