// Copyright 2015 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.

// The App Launcher is an adjunct product of Google Chrome, but it has a
// distinct registry entry. The functions in this file tap into various points
// in installer flow to update the App Launcher's registry, including the
// removal of deprecated app commands. This concentrates ugly code to to one
// place to facilitate future refactoring.

#ifndef CHROME_INSTALLER_SETUP_APP_LAUNCHER_INSTALLER_H_
#define CHROME_INSTALLER_SETUP_APP_LAUNCHER_INSTALLER_H_

#if defined(GOOGLE_CHROME_BUILD)

#include <windows.h>

namespace base {
class FilePath;
class Version;
}  // namespace base

class WorkItemList;

namespace installer {

class InstallerState;

// Remove App Launcher's registry key, so it is in sync with Google Chrome's.
// Note: The key is added by App Launcher in SetDidRunForNDayActiveStats().
void RemoveAppLauncherVersionKey(HKEY reg_root);

// Adds work item to unconditionally remove legacy executables.
void AddRemoveLegacyAppHostExeWorkItems(const base::FilePath& target_path,
                                        const base::FilePath& temp_path,
                                        WorkItemList* list);

// Adds work item to unconditionally remove legacy app commands like
// "install-application", "install-extension", and
// "quick-enable-application-host".
void AddRemoveLegacyAppCommandsWorkItems(
    const InstallerState& installer_state,
    WorkItemList* work_item_list);

}  // namespace installer

#endif  // defined(GOOGLE_CHROME_BUILD)

#endif  // CHROME_INSTALLER_SETUP_APP_LAUNCHER_INSTALLER_H_
