// Copyright 2020 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package java

import (
	"android/soong/android"
	"android/soong/java/config"
)

var legacyCorePlatformApiModules = []string{
	"AAECarSystemUI",
	"AAECarSystemUI-tests",
	"ArcSettings",
	"ahat-test-dump",
	"android.car",
	"android.test.mock",
	"android.test.mock.impl",
	"AoapTestDeviceApp",
	"AoapTestHostApp",
	"api-stubs-docs",
	"art_cts_jvmti_test_library",
	"art-gtest-jars-MyClassNatives",
	"BackupEncryption",
	"BackupFrameworksServicesRoboTests",
	"backuplib",
	"BandwidthEnforcementTest",
	"BlockedNumberProvider",
	"BluetoothInstrumentationTests",
	"BluetoothMidiLib",
	"BluetoothMidiService",
	"BTTestApp",
	"CallEnhancement",
	"CapCtrlInterface",
	"CarService",
	"CarServiceTest",
	"car-service-test-lib",
	"car-service-test-static-lib",
	"CertInstaller",
	"com.qti.location.sdk",
	"com.qti.media.secureprocessor",
	"ConnectivityManagerTest",
	"ContactsProvider",
	"CorePerfTests",
	"core-tests-support",
	"cronet_impl_common_java",
	"cronet_impl_native_java",
	"cronet_impl_platform_java",
	"CtsAppExitTestCases",
	"CtsContentTestCases",
	"CtsLibcoreWycheproofBCTestCases",
	"CtsMediaTestCases",
	"CtsNetTestCases",
	"CtsNetTestCasesLatestSdk",
	"CtsSecurityTestCases",
	"CtsSuspendAppsTestCases",
	"CtsUsageStatsTestCases",
	"DeadpoolService",
	"DeadpoolServiceBtServices",
	"DeviceInfo",
	"DiagnosticTools",
	"DisplayCutoutEmulationEmu01Overlay",
	"DocumentsUIGoogleTests",
	"DocumentsUIPerfTests",
	"DocumentsUITests",
	"DocumentsUIUnitTests",
	"DownloadProvider",
	"DownloadProviderTests",
	"DownloadProviderUi",
	"ds-car-docs", // for AAOS API documentation only
	"DynamicSystemInstallationService",
	"EmergencyInfo-lib",
	"EthernetServiceTests",
	"ExternalStorageProvider",
	"face-V1-0-javalib",
	"FloralClocks",
	"framework-jobscheduler",
	"framework-minus-apex",
	"framework-minus-apex-intdefs",
	"FrameworkOverlayG6QU3",
	"FrameworksCoreTests",
	"FrameworksIkeTests",
	"FrameworksNetCommonTests",
	"FrameworksNetTests",
	"FrameworksServicesRoboTests",
	"FrameworksServicesTests",
	"FrameworksMockingServicesTests",
	"FrameworksUtilTests",
	"GtsIncrementalInstallTestCases",
	"GtsIncrementalInstallTriggerApp",
	"GtsInstallerV2TestCases",
	"HelloOslo",
	"hid",
	"hidl_test_java_java",
	"hwbinder",
	"imssettings",
	"izat.lib.glue",
	"KeyChain",
	"LocalSettingsLib",
	"LocalTransport",
	"lockagent",
	"mediaframeworktest",
	"mediatek-ims-base",
	"MmsService",
	"ModemTestMode",
	"MtkCapCtrl",
	"MtpService",
	"MultiDisplayProvider",
	"my.tests.snapdragonsdktest",
	"NetworkSetting",
	"NetworkStackIntegrationTestsLib",
	"NetworkStackNextIntegrationTests",
	"NetworkStackNextTests",
	"NetworkStackTests",
	"NetworkStackTestsLib",
	"online-gcm-ref-docs",
	"online-gts-docs",
	"PerformanceMode",
	"platform_library-docs",
	"PowerStatsService",
	"PrintSpooler",
	"pxp-monitor",
	"QColor",
	"qcom.fmradio",
	"QDCMMobileApp",
	"Qmmi",
	"QPerformance",
	"remotesimlockmanagerlibrary",
	"RollbackTest",
	"sam",
	"saminterfacelibrary",
	"sammanagerlibrary",
	"service-blobstore",
	"service-connectivity-pre-jarjar",
	"service-jobscheduler",
	"services",
	"services.accessibility",
	"services.backup",
	"services.core.unboosted",
	"services.devicepolicy",
	"services.print",
	"services.usage",
	"services.usb",
	"Settings-core",
	"SettingsGoogle",
	"SettingsGoogleOverlayCoral",
	"SettingsGoogleOverlayFlame",
	"SettingsLib",
	"SettingsOverlayG020A",
	"SettingsOverlayG020B",
	"SettingsOverlayG020C",
	"SettingsOverlayG020D",
	"SettingsOverlayG020E",
	"SettingsOverlayG020E_VN",
	"SettingsOverlayG020F",
	"SettingsOverlayG020F_VN",
	"SettingsOverlayG020G",
	"SettingsOverlayG020G_VN",
	"SettingsOverlayG020H",
	"SettingsOverlayG020H_VN",
	"SettingsOverlayG020I",
	"SettingsOverlayG020I_VN",
	"SettingsOverlayG020J",
	"SettingsOverlayG020M",
	"SettingsOverlayG020N",
	"SettingsOverlayG020P",
	"SettingsOverlayG020Q",
	"SettingsOverlayG025H",
	"SettingsOverlayG025J",
	"SettingsOverlayG025M",
	"SettingsOverlayG025N",
	"SettingsOverlayG5NZ6",
	"SettingsProvider",
	"SettingsProviderTest",
	"SettingsRoboTests",
	"Shell",
	"ShellTests",
	"SimContact",
	"SimContacts",
	"SimSettings",
	"sl4a.Common",
	"StatementService",
	"SystemUI-core",
	"SystemUISharedLib",
	"SystemUI-tests",
	"tcmiface",
	"Telecom",
	"TelecomUnitTests",
	"telephony-common",
	"TelephonyProviderTests",
	"TeleService",
	"testables",
	"TetheringTests",
	"TetheringTestsLib",
	"time_zone_distro_installer",
	"time_zone_distro_installer-tests",
	"time_zone_distro-tests",
	"time_zone_updater",
	"TMobilePlanProvider",
	"TvProvider",
	"uiautomator-stubs-docs",
	"uimgbamanagerlibrary",
	"UsbHostExternalManagementTestApp",
	"UserDictionaryProvider",
	"UxPerformance",
	"WallpaperBackup",
	"WallpaperBackupAgentTests",
	"WfdCommon",
}

var legacyCorePlatformApiLookup = make(map[string]struct{})

func init() {
	for _, module := range legacyCorePlatformApiModules {
		legacyCorePlatformApiLookup[module] = struct{}{}
	}
}

var legacyCorePlatformApiLookupKey = android.NewOnceKey("legacyCorePlatformApiLookup")

func getLegacyCorePlatformApiLookup(config android.Config) map[string]struct{} {
	return config.Once(legacyCorePlatformApiLookupKey, func() interface{} {
		return legacyCorePlatformApiLookup
	}).(map[string]struct{})
}

// useLegacyCorePlatformApi checks to see whether the supplied module name is in the list of modules
// that are able to use the legacy core platform API and returns true if it does, false otherwise.
//
// This method takes the module name separately from the context as this may be being called for a
// module that is not the target of the supplied context.
func useLegacyCorePlatformApi(ctx android.EarlyModuleContext, moduleName string) bool {
	lookup := getLegacyCorePlatformApiLookup(ctx.Config())
	_, found := lookup[moduleName]
	return found
}

func corePlatformSystemModules(ctx android.EarlyModuleContext) string {
	if useLegacyCorePlatformApi(ctx, ctx.ModuleName()) {
		return config.LegacyCorePlatformSystemModules
	} else {
		return config.StableCorePlatformSystemModules
	}
}

func corePlatformBootclasspathLibraries(ctx android.EarlyModuleContext) []string {
	if useLegacyCorePlatformApi(ctx, ctx.ModuleName()) {
		return config.LegacyCorePlatformBootclasspathLibraries
	} else {
		return config.StableCorePlatformBootclasspathLibraries
	}
}
