diff --git a/lib/controllers/platform-controller.ts b/lib/controllers/platform-controller.ts index c9b75b9e44..8b98e80af0 100644 --- a/lib/controllers/platform-controller.ts +++ b/lib/controllers/platform-controller.ts @@ -25,14 +25,18 @@ export class PlatformController implements IPlatformController { private $packageInstallationManager: IPackageInstallationManager, private $projectDataService: IProjectDataService, private $platformsDataService: IPlatformsDataService, - private $projectChangesService: IProjectChangesService + private $projectChangesService: IProjectChangesService, + private $mobileHelper: Mobile.IMobileHelper ) {} - public async addPlatform(addPlatformData: IAddPlatformData): Promise { + public async addPlatform( + addPlatformData: IAddPlatformData, + projectData?: IProjectData + ): Promise { const [platform, version] = addPlatformData.platform .toLowerCase() .split("@"); - const projectData = this.$projectDataService.getProjectData( + projectData ??= this.$projectDataService.getProjectData( addPlatformData.projectDir ); const platformData = this.$platformsDataService.getPlatformData( @@ -68,18 +72,54 @@ export class PlatformController implements IPlatformController { this.$fs.ensureDirectoryExists( path.join(projectData.platformsDir, platform) ); + + if (this.$mobileHelper.isAndroidPlatform(platform)) { + const gradlePropertiesPath = path.resolve( + platformData.projectRoot, + "gradle.properties" + ); + const commentHeader = "# App configuration"; + const appPath = projectData.getAppDirectoryRelativePath(); + const appResourcesPath = projectData.getAppResourcesRelativeDirectoryPath(); + + let gradlePropertiesContents = ""; + if (this.$fs.exists(gradlePropertiesPath)) { + gradlePropertiesContents = this.$fs + .readFile(gradlePropertiesPath) + .toString(); + } + + if (!gradlePropertiesContents.includes(commentHeader)) { + const dataToWrite = [ + "", + "", + commentHeader, + `appPath = ${appPath}`, + `appResourcesPath = ${appResourcesPath}`, + "", + ].join("\n"); + + gradlePropertiesContents += dataToWrite; + + this.$logger.trace("Updated gradle.properties with project data..."); + this.$fs.writeFile(gradlePropertiesPath, gradlePropertiesContents); + } + } this.$logger.info( `Platform ${platform} successfully added. v${installedPlatformVersion}` ); } public async addPlatformIfNeeded( - addPlatformData: IAddPlatformData + addPlatformData: IAddPlatformData, + projectData?: IProjectData ): Promise { const [platform] = addPlatformData.platform.toLowerCase().split("@"); - const projectData = this.$projectDataService.getProjectData( + + projectData ??= this.$projectDataService.getProjectData( addPlatformData.projectDir ); + const platformData = this.$platformsDataService.getPlatformData( platform, projectData @@ -91,7 +131,7 @@ export class PlatformController implements IPlatformController { addPlatformData.nativePrepare ); if (shouldAddPlatform) { - await this.addPlatform(addPlatformData); + await this.addPlatform(addPlatformData, projectData); } } diff --git a/lib/controllers/prepare-controller.ts b/lib/controllers/prepare-controller.ts index df3272136c..8a4fc1e85e 100644 --- a/lib/controllers/prepare-controller.ts +++ b/lib/controllers/prepare-controller.ts @@ -127,7 +127,10 @@ export class PrepareController extends EventEmitter { prepareData: IPrepareData, projectData: IProjectData ): Promise { - await this.$platformController.addPlatformIfNeeded(prepareData); + await this.$platformController.addPlatformIfNeeded( + prepareData, + projectData + ); await this.trackRuntimeVersion(prepareData.platform, projectData); this.$logger.info("Preparing project..."); @@ -375,7 +378,10 @@ export class PrepareController extends EventEmitter { projectData: IProjectData ): Promise { const dependencies = this.$nodeModulesDependenciesBuilder - .getProductionDependencies(projectData.projectDir, projectData.ignoredDependencies) + .getProductionDependencies( + projectData.projectDir, + projectData.ignoredDependencies + ) .filter((dep) => dep.nativescript); const pluginsNativeDirectories = dependencies.map((dep) => path.join( diff --git a/lib/definitions/platform.d.ts b/lib/definitions/platform.d.ts index 3940f99b74..10d434bf97 100644 --- a/lib/definitions/platform.d.ts +++ b/lib/definitions/platform.d.ts @@ -78,7 +78,10 @@ interface IPrepareNodeModulesData { } interface INodeModulesDependenciesBuilder { - getProductionDependencies(projectPath: string, ignore?: string[]): IDependencyData[]; + getProductionDependencies( + projectPath: string, + ignore?: string[] + ): IDependencyData[]; } interface IBuildInfo { @@ -118,8 +121,14 @@ interface IAddPlatformData extends IControllerDataBase { } interface IPlatformController { - addPlatform(addPlatformData: IAddPlatformData): Promise; - addPlatformIfNeeded(addPlatformData: IAddPlatformData): Promise; + addPlatform( + addPlatformData: IAddPlatformData, + projectData?: IProjectData + ): Promise; + addPlatformIfNeeded( + addPlatformData: IAddPlatformData, + projectData?: IProjectData + ): Promise; } interface IAddPlatformService { diff --git a/test/controllers/add-platform-controller.ts b/test/controllers/add-platform-controller.ts index 815556c4b7..8b98fe0ec3 100644 --- a/test/controllers/add-platform-controller.ts +++ b/test/controllers/add-platform-controller.ts @@ -9,6 +9,7 @@ import { PackageManager } from "../../lib/package-manager"; import { NodePackageManager } from "../../lib/node-package-manager"; import { YarnPackageManager } from "../../lib/yarn-package-manager"; import { PnpmPackageManager } from "../../lib/pnpm-package-manager"; +import { MobileHelper } from "../../lib/common/mobile/mobile-helper"; let actualMessage: string = null; const latestFrameworkVersion = "5.3.1"; @@ -33,6 +34,7 @@ function createInjector(data?: { latestFrameworkVersion: string }) { getSettingValue: async (settingName: string): Promise => undefined, }); injector.register("tempService", TempServiceStub); + injector.register("mobileHelper", MobileHelper); const logger = injector.resolve("logger"); logger.info = (message: string) => (actualMessage = message); @@ -43,7 +45,15 @@ function createInjector(data?: { latestFrameworkVersion: string }) { packageInstallationManager.getLatestCompatibleVersion = async () => version; const fs = injector.resolve("fs"); + const exists: Function = fs.exists.bind(fs); fs.readJson = () => ({ version }); + fs.exists = (path: string) => { + if (path.includes("gradle.properties")) { + return false; + } + return exists(path); + }; + fs.writeFile = () => {}; return injector; } @@ -149,4 +159,32 @@ describe("PlatformController", () => { // assert.deepStrictEqual(extractedPackageFromPacote, expectedPackageToAdd); // }); }); + + it(`should update gradle.properties after adding android platform`, async () => { + const injector = createInjector(); + const fs = injector.resolve("fs"); + + let writeFileCalled = false; + let writeFileContents = ""; + fs.writeFile = (path: string, contents: string) => { + if (path.includes("gradle.properties")) { + writeFileCalled = true; + writeFileContents = contents; + } + }; + + const platformController: PlatformController = injector.resolve( + "platformController" + ); + await platformController.addPlatform({ + projectDir, + platform: "android", + }); + + assert(writeFileCalled, "expected to write gradle.properties"); + assert( + writeFileContents.includes("# App configuration"), + "expected gradle.properties to have the project data written to it" + ); + }); });