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
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_APP_RESTORE_ARC_SAVE_HANDLER_H_
#define COMPONENTS_APP_RESTORE_ARC_SAVE_HANDLER_H_
#include <map>
#include <memory>
#include <set>
#include <utility>
#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
namespace app_restore {
struct AppLaunchInfo;
struct WindowInfo;
} // namespace app_restore
namespace ash {
namespace full_restore {
class FullRestoreAppLaunchHandlerArcAppBrowserTest;
}
} // namespace ash
namespace aura {
class Window;
}
namespace full_restore {
// ArcSaveHandler is a helper class for FullRestoreSaveHandler to handle ARC app
// windows special cases, e.g. ARC task creation, ARC session id, etc.
//
// Task id is saved as the window id. Session id is generated when launch the
// ARC app, and sent back as a parameter of OnTaskCreated, to connect the launch
// parameters with the task id. `session_id_to_app_launch_info_` saves the
// mapping from the session id to the launch parameter.
//
// When the task is created, in OnTaskCreated callback, get the launch info from
// `session_id_to_app_launch_info_` with `session id`, and save the launch info
// using the task is as the window id.
//
// For ghost window, session id is used as the the window id before the task is
// created. When the task is created, window id is modified to use the task id
// as the window id.
class COMPONENT_EXPORT(APP_RESTORE) ArcSaveHandler {
public:
using AppLaunchInfoPtr = std::unique_ptr<app_restore::AppLaunchInfo>;
using SessionIdMap =
std::map<int32_t, std::pair<AppLaunchInfoPtr, base::TimeTicks>>;
explicit ArcSaveHandler(const base::FilePath& profile_path);
ArcSaveHandler(const ArcSaveHandler&) = delete;
ArcSaveHandler& operator=(const ArcSaveHandler&) = delete;
~ArcSaveHandler();
// Saves |app_launch_info| to |arc_session_id_to_app_launch_info_|, and wait
// for the ARC task to be created.
void SaveAppLaunchInfo(AppLaunchInfoPtr app_launch_info);
// Saves |window_info|.
void ModifyWindowInfo(const app_restore::WindowInfo& window_info);
// Invoked when |window| is initialized.
void OnWindowInitialized(aura::Window* window);
// Invoked when |window| is destroyed.
void OnWindowDestroyed(aura::Window* window);
// Invoked when the task is created for an ARC app.
void OnTaskCreated(const std::string& app_id,
int32_t task_id,
int32_t session_id);
// Invoked when the task is destroyed for an ARC app.
void OnTaskDestroyed(int32_t task_id);
// Invoked when Google Play Store is enabled or disabled.
void OnArcPlayStoreEnabledChanged(bool enabled);
// Invoked when the task theme color is updated for an ARC app.
void OnTaskThemeColorUpdated(int32_t task_id,
uint32_t primary_color,
uint32_t status_bar_color);
// Generates the ARC session id (0 - 1,000,000,000) for save ARC apps.
int32_t GetArcSessionId();
// Returns the app id that associates with |window|.
std::string GetAppId(aura::Window* window);
void set_is_connection_ready(bool is_connection_ready) {
is_connection_ready_ = is_connection_ready;
}
private:
friend class FullRestoreSaveHandlerTestApi;
friend class ash::full_restore::FullRestoreAppLaunchHandlerArcAppBrowserTest;
// Starts the timer to check whether a task is created for the app launching
// (if timer isn't already running).
void MaybeStartCheckTimer();
// Check whether a task is created for each app launching. If not, remove the
// app launching record.
void CheckTasksForAppLaunching();
// The user profile path for ARC app.
base::FilePath profile_path_;
int32_t session_id_ = 0;
// Specify whether the ARC instance connection is ready.
bool is_connection_ready_ = false;
// The map from the ARC session id to the app launch info.
SessionIdMap session_id_to_app_launch_info_;
// The map from the task id to the app id. The task id is saved in the window
// property. This map is used to find the app id when save the window info.
std::map<int32_t, std::string> task_id_to_app_id_;
// The map from the session id to the app id for ghost windows, so that we can
// save the restore data, once the ghost window is created.
std::map<int32_t, std::string> ghost_window_session_id_to_app_id_;
// ARC app tasks could be created after the window initialized.
// |arc_window_candidates_| is used to record those initialized ARC app
// windows, whose tasks have not been created. Once the task for the window is
// created, the window is removed from |arc_window_candidates_|.
std::set<raw_ptr<aura::Window, SetExperimental>> arc_window_candidates_;
// Timer used to check whether a task is created. App launching could have
// failed. If an app is launched without a task created, the launch record
// should be removed from |session_id_to_app_launch_info_|.
base::RepeatingTimer check_timer_;
base::WeakPtrFactory<ArcSaveHandler> weak_factory_{this};
};
} // namespace full_restore
#endif // COMPONENTS_APP_RESTORE_ARC_SAVE_HANDLER_H_
|