blob: 0310df800ef132484824a06cf6ba353c6683ad98 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_APP_RESTORE_RESTORE_DATA_H_
#define COMPONENTS_APP_RESTORE_RESTORE_DATA_H_
#include <map>
#include <memory>
#include "base/component_export.h"
#include "components/app_restore/app_restore_data.h"
namespace base {
class Value;
}
namespace app_restore {
struct AppLaunchInfo;
struct WindowInfo;
// This class is responsible for saving all app launch and app windows
// information. It can be converted to JSON format to be written to the
// FullRestoreData file.
class COMPONENT_EXPORT(APP_RESTORE) RestoreData {
public:
// Map from a window id to AppRestoreData.
using LaunchList = std::map<int, std::unique_ptr<AppRestoreData>>;
// Map from an app id to LaunchList.
using AppIdToLaunchList = std::map<std::string, LaunchList>;
RestoreData();
explicit RestoreData(std::unique_ptr<base::Value> restore_data_value);
RestoreData(const RestoreData&) = delete;
RestoreData& operator=(const RestoreData&) = delete;
~RestoreData();
std::unique_ptr<RestoreData> Clone() const;
// Converts |app_id_to_launch_list_| to base::Value, e.g.:
// {
// "odknhmnlageboeamepcngndbggdpaobj": // app_id
// {
// "403": // window_id
// {
// "container": 0,
// "disposition": 1,
// "display_id": "22000000",
// "index": 3,
// "desk_id": 1,
// "restored_bounds": { 0, 100, 200, 300 },
// "current_bounds": { 100, 200, 200, 300 },
// "window_state_type": 256,
// },
// },
// "pjibgclleladliembfgfagdaldikeohf": // app_id
// {
// "413": // window_id
// {
// "container": 0,
// "disposition": 3,
// "display_id": "22000000",
// ...
// },
// "415": // window_id
// {
// ...
// },
// },
// }
base::Value ConvertToValue() const;
// Returns true if there are app type browsers. Otherwise, returns false.
bool HasAppTypeBrowser() const;
// Returns true if there are normal browsers. Otherwise, returns false.
bool HasBrowser() const;
// Returns true if there is a AppRestoreData for the given |app_id| and
// |window_id|. Otherwise, returns false.
bool HasAppRestoreData(const std::string& app_id, int32_t window_id);
// Adds |app_launch_info| to |app_id_to_launch_list_|.
void AddAppLaunchInfo(std::unique_ptr<AppLaunchInfo> app_launch_info);
// Modify the window id for |app_id| from |old_window_id| to |new_window_id|.
// This function is used for ARC ghost window only, to switch the window id
// from the session id to the task id.
void ModifyWindowId(const std::string& app_id,
int32_t old_window_id,
int32_t new_window_id);
// Modifies the window's information based on |window_info| for the window
// with |window_id| of the app with |app_id|.
void ModifyWindowInfo(const std::string& app_id,
int32_t window_id,
const WindowInfo& window_info);
// Modifies the window's theme colors for the window with |window_id| of the
// app with |app_id|,
void ModifyThemeColor(const std::string& app_id,
int32_t window_id,
uint32_t primary_color,
uint32_t status_bar_color);
// Modifies |chrome_app_id_to_current_window_id_| to set the next restore
// window id for the given |app_id|.
//
// If there is only 1 window for |app_id|, its window id is set as the
// restore window id to restore window properties when there is a window
// created for |app_id|.
//
// If there is more than 1 window for |app_id|, we can't know which window is
// for which launching, so activation_index for all windows are set as
// INT32_MIN to send all windows to the background. The first record in
// LaunchList is set as the restore window id for |app_id|.
void SetNextRestoreWindowIdForChromeApp(const std::string& app_id);
// Removes a AppRestoreData with |window_id| for |app_id|.
void RemoveAppRestoreData(const std::string& app_id, int window_id);
// Sends the window for |app_id| and |window_id| to background.
void SendWindowToBackground(const std::string& app_id, int window_id);
// Removes the launch list for |app_id|.
void RemoveApp(const std::string& app_id);
// Gets the app launch information with `window_id` for `app_id`.
std::unique_ptr<AppLaunchInfo> GetAppLaunchInfo(const std::string& app_id,
int window_id);
// Gets the window information with |window_id| for |app_id|.
std::unique_ptr<WindowInfo> GetWindowInfo(const std::string& app_id,
int window_id);
// Fetches the restore window id from the restore data for the given chrome
// app |app_id|. |app_id| should be a Chrome app id.
//
// If there is only 1 window for |app_id|, return its window id, and remove
// the record of |app_id| in |chrome_app_id_to_current_window_id_|, so that
// when there are more windows created for |app_id|, FetchRestoreWindowId
// returns 0, and we know they are not the restored window, but launched by
// the user.
//
// If there is more than 1 window for |app_id|, returns the window id saved in
// |chrome_app_id_to_current_window_id_|, then modify
// |chrome_app_id_to_current_window_id_| to set the next restore window id.
//
// For example,
// app_id: 'aa' {window id: 1};
// app_id: 'bb' {window id: 11, 12, 13};
// chrome_app_id_to_current_window_id_: 'aa': 1 'bb': 11
//
// FetchRestoreWindowId('aa') return 1.
// Then chrome_app_id_to_current_window_id_: 'bb': 11
// FetchRestoreWindowId('aa') return 0.
//
// FetchRestoreWindowId('bb') return 11.
// Then chrome_app_id_to_current_window_id_: 'bb': 12
// FetchRestoreWindowId('bb') return 12.
// Then chrome_app_id_to_current_window_id_: 'bb': 13
// FetchRestoreWindowId('bb') return 13.
// Then chrome_app_id_to_current_window_id_ is empty.
// FetchRestoreWindowId('bb') return 0.
int32_t FetchRestoreWindowId(const std::string& app_id);
const AppRestoreData* GetAppRestoreData(const std::string& app_id,
int window_id) const;
std::string ToString() const;
const AppIdToLaunchList& app_id_to_launch_list() const {
return app_id_to_launch_list_;
}
private:
// Returns the pointer to AppRestoreData for the given |app_id| and
// |window_id|. Returns null if there is no AppRestoreData.
AppRestoreData* GetAppRestoreDataMutable(const std::string& app_id,
int window_id);
AppIdToLaunchList app_id_to_launch_list_;
// Saves the next restore window_id to be handled for each chrome app.
std::map<std::string, int> chrome_app_id_to_current_window_id_;
};
} // namespace app_restore
#endif // COMPONENTS_APP_RESTORE_RESTORE_DATA_H_