// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/web_applications/migrations/migrate_preinstalls_to_aps.h"
#include <string_view>
#include <vector>
#include "base/containers/fixed_flat_set.h"
#include "chrome/browser/web_applications/web_app_constants.h"
#include "chrome/browser/web_applications/web_app_id_constants.h"
#include "chrome/browser/web_applications/web_app_registrar.h"
#include "chrome/browser/web_applications/web_app_registry_update.h"
#include "chrome/browser/web_applications/web_app_sync_bridge.h"
// Enable VLOG level 1.
#undef ENABLED_VLOG_LEVEL
#define ENABLED_VLOG_LEVEL 1
namespace web_app::migrations {
void MigratePreinstallsToAps(WebAppSyncBridge* sync_bridge) {
std::vector<std::string> migrate_default;
std::vector<std::string> migrate_oem;
int count = 0;
for (const web_app::WebApp& web_app : sync_bridge->registrar().GetApps()) {
++count;
// Ignore core 6 apps: gmail, docs, drive, sheets, slides, yt.
static constexpr auto kCoreApps = base::MakeFixedFlatSet<std::string_view>(
{kGmailAppId, kGoogleDocsAppId, kGoogleDriveAppId, kGoogleSheetsAppId,
kGoogleSlidesAppId, kYoutubeAppId});
if (kCoreApps.contains(web_app.app_id())) {
continue;
}
if (web_app.GetSources().Has(WebAppManagement::Type::kDefault)) {
if (web_app.chromeos_data() && web_app.chromeos_data()->oem_installed) {
migrate_oem.push_back(web_app.app_id());
} else {
migrate_default.push_back(web_app.app_id());
}
}
}
web_app::ScopedRegistryUpdate update = sync_bridge->BeginUpdate();
VLOG(1) << "Migrate apps=" << count << ", default=" << migrate_default.size()
<< ", oem=" << migrate_oem.size();
// Add source kApsDefault or kOem. The kDefault source will be removed when
// GetChromeBrandedApps() stops including these non-core apps.
for (const std::string& app_id : migrate_default) {
web_app::WebApp* app = update->UpdateApp(app_id);
if (!app) {
LOG(ERROR) << "Default app not found: " << app_id;
continue;
}
VLOG(1) << "Default: " << app_id;
app->AddSource(WebAppManagement::Type::kApsDefault);
}
for (const std::string& app_id : migrate_oem) {
web_app::WebApp* app = update->UpdateApp(app_id);
if (!app) {
LOG(ERROR) << "OEM app not found: " << app_id;
continue;
}
VLOG(1) << "OEM: " << app_id;
app->AddSource(WebAppManagement::Type::kOem);
}
}
} // namespace web_app::migrations