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_