chromium/chrome/browser/ash/remote_apps/remote_apps_model.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_REMOTE_APPS_REMOTE_APPS_MODEL_H_
#define CHROME_BROWSER_ASH_REMOTE_APPS_REMOTE_APPS_MODEL_H_

#include <map>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>

#include "base/functional/callback.h"
#include "chrome/browser/ash/remote_apps/id_generator.h"
#include "ui/gfx/image/image_skia.h"
#include "url/gurl.h"

namespace ash {

// Class which stores the state of Remote Apps added by |RemoteAppsManager| and
// maintains the association between the apps and folders.
class RemoteAppsModel {
 public:
  struct AppInfo {
    AppInfo(const std::string& id,
            const std::string& name,
            const GURL& icon_url,
            std::string folder_id,
            bool add_to_front);
    AppInfo(const AppInfo& other);
    ~AppInfo();

    const std::string id;
    const std::string name;
    const GURL icon_url;
    std::string folder_id;
    gfx::ImageSkia icon;
    const bool add_to_front;
  };

  struct FolderInfo {
    FolderInfo(const std::string& id,
               const std::string& name,
               bool add_to_front);
    FolderInfo(const FolderInfo& other);
    ~FolderInfo();

    const std::string id;
    const std::string name;
    const bool add_to_front;
    std::set<std::string> items;
  };

  RemoteAppsModel();
  RemoteAppsModel(const RemoteAppsModel&) = delete;
  RemoteAppsModel& operator=(const RemoteAppsModel&) = delete;
  ~RemoteAppsModel();

  // Adds an app. If |folder_id| is non-empty, the caller should ensure that
  // the folder exists by calling |HasFolder()| first. The app is added to the
  // corresponding folder.
  RemoteAppsModel::AppInfo& AddApp(const std::string& name,
                                   const GURL& icon_url,
                                   const std::string& folder_id,
                                   bool add_to_front);

  // Returns true if an app with ID |id| exists in the model.
  bool HasApp(const std::string& id) const;

  // Returns the |AppInfo| of the app with ID |id|. The caller should ensure
  // that the app exists by calling |HasApp()| first.
  RemoteAppsModel::AppInfo& GetAppInfo(const std::string& id);

  // Returns a map from string |id| to |AppInfo| for all apps in the model.
  const std::map<std::string, AppInfo>& GetAllAppInfo() const;

  // Adds a folder.
  RemoteAppsModel::FolderInfo& AddFolder(const std::string& folder_name,
                                         bool add_to_front);

  // Returns true if a folder with ID |folder_id| exists.
  bool HasFolder(const std::string& folder_id) const;

  // Returns the |FolderInfo| of the folder with ID |folder_id|. The caller
  // should ensure that the folder exists by calling |HasFolder()| first.
  RemoteAppsModel::FolderInfo& GetFolderInfo(const std::string& folder_id);

  // Deletes the app with ID |id|. The caller should ensure that the app exists
  // by calling |HasApp()| first.
  void DeleteApp(const std::string& id);

  // Deletes the folder with ID |folder_id|. The caller should ensure that the
  // folder exists by calling |HasFolder()| first. All items in the folder are
  // moved out of the folder.
  void DeleteFolder(const std::string& folder_id);

  void SetIdGeneratorForTesting(std::unique_ptr<IdGenerator> id_generator) {
    id_generator_ = std::move(id_generator);
  }

 private:
  std::unique_ptr<IdGenerator> id_generator_;
  std::map<std::string, AppInfo> app_map_;
  std::map<std::string, FolderInfo> folder_map_;
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_REMOTE_APPS_REMOTE_APPS_MODEL_H_