// Copyright (c) 2012 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 APPS_APP_RESTORE_SERVICE_H_
#define APPS_APP_RESTORE_SERVICE_H_

#include <string>
#include <vector>

#include "apps/app_lifetime_monitor.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/browser/app_window/app_window_registry.h"

namespace extensions {
class Extension;
}

class Profile;

namespace apps {

// Tracks what apps need to be restarted when the browser restarts.
class AppRestoreService : public KeyedService,
                          public AppLifetimeMonitor::Observer {
 public:
  // Returns true if apps should be restored on the current platform, given
  // whether this new browser process launched due to a restart.
  static bool ShouldRestoreApps(bool is_browser_restart);

  explicit AppRestoreService(Profile* profile);

  // Restart apps that need to be restarted and clear the "running" preference
  // from apps to prevent them being restarted in subsequent restarts.
  void HandleStartup(bool should_restore_apps);

  // Returns whether this extension is running or, at startup, whether it was
  // running when Chrome was last terminated.
  bool IsAppRestorable(const std::string& extension_id);

  static AppRestoreService* Get(Profile* profile);

 private:
  // AppLifetimeMonitor::Observer.
  void OnAppStart(Profile* profile, const std::string& app_id) override;
  void OnAppActivated(Profile* profile, const std::string& app_id) override;
  void OnAppDeactivated(Profile* profile, const std::string& app_id) override;
  void OnAppStop(Profile* profile, const std::string& app_id) override;
  void OnChromeTerminating() override;

  // KeyedService.
  void Shutdown() override;

  void RecordAppStart(const std::string& extension_id);
  void RecordAppStop(const std::string& extension_id);
  void RecordAppActiveState(const std::string& id, bool is_active);

  void RestoreApp(const extensions::Extension* extension);

  void StartObservingAppLifetime();
  void StopObservingAppLifetime();

  Profile* profile_;

  DISALLOW_COPY_AND_ASSIGN(AppRestoreService);
};

}  // namespace apps

#endif  // APPS_APP_RESTORE_SERVICE_H_
