Skip to content

Commit 344ceb7

Browse files
Make androidSysInfo calls sync
As one of the methods in androidSysInfo no longer needs to be async, after removing its async signature, this lead to avalanche of methods that no longer needs to be async. So fix all of them.
1 parent 54cff3a commit 344ceb7

10 files changed

+86
-72
lines changed

lib/android-tools-info.ts

+61-48
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,15 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
2525
private $options: IOptions,
2626
protected $staticConfig: Config.IStaticConfig) { }
2727

28-
public async getToolsInfo(): Promise<IAndroidToolsInfoData> {
28+
@cache()
29+
public getToolsInfo(): IAndroidToolsInfoData {
2930
if (!this.toolsInfo) {
3031
let infoData: IAndroidToolsInfoData = Object.create(null);
3132
infoData.androidHomeEnvVar = this.androidHome;
32-
infoData.compileSdkVersion = await this.getCompileSdk();
33-
infoData.buildToolsVersion = await this.getBuildToolsVersion();
34-
infoData.targetSdkVersion = await this.getTargetSdk();
35-
infoData.supportRepositoryVersion = await this.getAndroidSupportRepositoryVersion();
33+
infoData.compileSdkVersion = this.getCompileSdk();
34+
infoData.buildToolsVersion = this.getBuildToolsVersion();
35+
infoData.targetSdkVersion = this.getTargetSdk();
36+
infoData.supportRepositoryVersion = this.getAndroidSupportRepositoryVersion();
3637
infoData.generateTypings = this.shouldGenerateTypings();
3738

3839
this.toolsInfo = infoData;
@@ -41,21 +42,10 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
4142
return this.toolsInfo;
4243
}
4344

44-
@cache()
45-
private getPathToSdkManagementTool(): string {
46-
const pathToSdkmanager = path.join(this.androidHome, "tools", "bin", "sdkmanager") + (this.$hostInfo.isWindows ? ".bat" : "");
47-
const pathToAndroidExecutable = path.join(this.androidHome, "tools", "android") + (this.$hostInfo.isWindows ? ".bat" : "");
48-
const pathToExecutable = this.$fs.exists(pathToSdkmanager) ? pathToSdkmanager : pathToAndroidExecutable;
49-
50-
this.$logger.trace(`Path to Android SDK Management tool is: ${pathToExecutable}`);
51-
52-
return pathToExecutable.replace(this.androidHome, this.$hostInfo.isWindows ? "%ANDROID_HOME%" : "$ANDROID_HOME");
53-
}
54-
55-
public async validateInfo(options?: { showWarningsAsErrors: boolean, validateTargetSdk: boolean }): Promise<boolean> {
45+
public validateInfo(options?: { showWarningsAsErrors: boolean, validateTargetSdk: boolean }): boolean {
5646
let detectedErrors = false;
5747
this.showWarningsAsErrors = options && options.showWarningsAsErrors;
58-
let toolsInfoData = await this.getToolsInfo();
48+
let toolsInfoData = this.getToolsInfo();
5949
let isAndroidHomeValid = this.validateAndroidHomeEnvVariable();
6050
if (!toolsInfoData.compileSdkVersion) {
6151
this.printMessage(`Cannot find a compatible Android SDK for compilation. To be able to build for Android, install Android SDK ${AndroidToolsInfo.MIN_REQUIRED_COMPILE_TARGET} or later.`,
@@ -149,26 +139,49 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
149139
return null;
150140
}
151141

152-
private _cachedAndroidHomeValidationResult: boolean = null;
142+
@cache()
153143
public validateAndroidHomeEnvVariable(options?: { showWarningsAsErrors: boolean }): boolean {
154-
if (this._cachedAndroidHomeValidationResult === null) {
155-
this.showWarningsAsErrors = options && options.showWarningsAsErrors;
156-
157-
this._cachedAndroidHomeValidationResult = true;
158-
let expectedDirectoriesInAndroidHome = ["build-tools", "tools", "platform-tools", "extras"];
159-
if (!this.androidHome || !this.$fs.exists(this.androidHome)) {
160-
this.printMessage("The ANDROID_HOME environment variable is not set or it points to a non-existent directory. You will not be able to perform any build-related operations for Android.",
161-
"To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory.");
162-
this._cachedAndroidHomeValidationResult = false;
163-
} else if (!_.some(expectedDirectoriesInAndroidHome.map(dir => this.$fs.exists(path.join(this.androidHome, dir))))) {
164-
this.printMessage("The ANDROID_HOME environment variable points to incorrect directory. You will not be able to perform any build-related operations for Android.",
165-
"To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory, " +
166-
"where you will find `tools` and `platform-tools` directories.");
167-
this._cachedAndroidHomeValidationResult = false;
168-
}
144+
if (options) {
145+
this.showWarningsAsErrors = options.showWarningsAsErrors;
146+
}
147+
148+
const expectedDirectoriesInAndroidHome = ["build-tools", "tools", "platform-tools", "extras"];
149+
let androidHomeValidationResult = true;
150+
151+
if (!this.androidHome || !this.$fs.exists(this.androidHome)) {
152+
this.printMessage("The ANDROID_HOME environment variable is not set or it points to a non-existent directory. You will not be able to perform any build-related operations for Android.",
153+
"To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory.");
154+
androidHomeValidationResult = false;
155+
} else if (!_.some(expectedDirectoriesInAndroidHome.map(dir => this.$fs.exists(path.join(this.androidHome, dir))))) {
156+
this.printMessage("The ANDROID_HOME environment variable points to incorrect directory. You will not be able to perform any build-related operations for Android.",
157+
"To be able to perform Android build-related operations, set the `ANDROID_HOME` variable to point to the root of your Android SDK installation directory, " +
158+
"where you will find `tools` and `platform-tools` directories.");
159+
androidHomeValidationResult = false;
160+
}
161+
162+
return androidHomeValidationResult;
163+
}
164+
165+
@cache()
166+
private getPathToSdkManagementTool(): string {
167+
const sdkmanagerName = "sdkmanager";
168+
let sdkManagementToolPath = sdkmanagerName;
169+
170+
const isAndroidHomeValid = this.validateAndroidHomeEnvVariable();
171+
172+
if (isAndroidHomeValid) {
173+
// In case ANDROID_HOME is correct, check if sdkmanager exists and if not it means the SDK has not been updated.
174+
// In this case user shoud use `android` from the command-line instead of sdkmanager.
175+
const pathToSdkmanager = path.join(this.androidHome, "tools", "bin", sdkmanagerName);
176+
const pathToAndroidExecutable = path.join(this.androidHome, "tools", "android");
177+
const pathToExecutable = this.$fs.exists(pathToSdkmanager) ? pathToSdkmanager : pathToAndroidExecutable;
178+
179+
this.$logger.trace(`Path to Android SDK Management tool is: ${pathToExecutable}`);
180+
181+
sdkManagementToolPath = pathToExecutable.replace(this.androidHome, this.$hostInfo.isWindows ? "%ANDROID_HOME%" : "$ANDROID_HOME");
169182
}
170183

171-
return this._cachedAndroidHomeValidationResult;
184+
return sdkManagementToolPath;
172185
}
173186

174187
private shouldGenerateTypings(): boolean {
@@ -196,19 +209,19 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
196209
}
197210
}
198211

199-
private async getCompileSdk(): Promise<number> {
212+
private getCompileSdk(): number {
200213
if (!this.selectedCompileSdk) {
201214
let userSpecifiedCompileSdk = this.$options.compileSdk;
202215
if (userSpecifiedCompileSdk) {
203-
let installedTargets = await this.getInstalledTargets();
216+
let installedTargets = this.getInstalledTargets();
204217
let androidCompileSdk = `${AndroidToolsInfo.ANDROID_TARGET_PREFIX}-${userSpecifiedCompileSdk}`;
205218
if (!_.includes(installedTargets, androidCompileSdk)) {
206219
this.$errors.failWithoutHelp(`You have specified '${userSpecifiedCompileSdk}' for compile sdk, but it is not installed on your system.`);
207220
}
208221

209222
this.selectedCompileSdk = userSpecifiedCompileSdk;
210223
} else {
211-
let latestValidAndroidTarget = await this.getLatestValidAndroidTarget();
224+
let latestValidAndroidTarget = this.getLatestValidAndroidTarget();
212225
if (latestValidAndroidTarget) {
213226
let integerVersion = this.parseAndroidSdkString(latestValidAndroidTarget);
214227

@@ -222,8 +235,8 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
222235
return this.selectedCompileSdk;
223236
}
224237

225-
private async getTargetSdk(): Promise<number> {
226-
let targetSdk = this.$options.sdk ? parseInt(this.$options.sdk) : await this.getCompileSdk();
238+
private getTargetSdk(): number {
239+
let targetSdk = this.$options.sdk ? parseInt(this.$options.sdk) : this.getCompileSdk();
227240
this.$logger.trace(`Selected targetSdk is: ${targetSdk}`);
228241
return targetSdk;
229242
}
@@ -258,7 +271,7 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
258271
return `${AndroidToolsInfo.REQUIRED_BUILD_TOOLS_RANGE_PREFIX} <=${this.getMaxSupportedVersion()}`;
259272
}
260273

261-
private async getBuildToolsVersion(): Promise<string> {
274+
private getBuildToolsVersion(): string {
262275
let buildToolsVersion: string;
263276
if (this.androidHome) {
264277
let pathToBuildTools = path.join(this.androidHome, "build-tools");
@@ -269,8 +282,8 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
269282
return buildToolsVersion;
270283
}
271284

272-
private async getAppCompatRange(): Promise<string> {
273-
let compileSdkVersion = await this.getCompileSdk();
285+
private getAppCompatRange(): string {
286+
let compileSdkVersion = this.getCompileSdk();
274287
let requiredAppCompatRange: string;
275288
if (compileSdkVersion) {
276289
requiredAppCompatRange = `>=${compileSdkVersion} <${compileSdkVersion + 1}`;
@@ -279,9 +292,9 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
279292
return requiredAppCompatRange;
280293
}
281294

282-
private async getAndroidSupportRepositoryVersion(): Promise<string> {
295+
private getAndroidSupportRepositoryVersion(): string {
283296
let selectedAppCompatVersion: string;
284-
let requiredAppCompatRange = await this.getAppCompatRange();
297+
let requiredAppCompatRange = this.getAppCompatRange();
285298
if (this.androidHome && requiredAppCompatRange) {
286299
let pathToAppCompat = path.join(this.androidHome, "extras", "android", "m2repository", "com", "android", "support", "appcompat-v7");
287300
selectedAppCompatVersion = this.getMatchingDir(pathToAppCompat, requiredAppCompatRange);
@@ -291,16 +304,16 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
291304
return selectedAppCompatVersion;
292305
}
293306

294-
private async getLatestValidAndroidTarget(): Promise<string> {
295-
let installedTargets = await this.getInstalledTargets();
307+
private getLatestValidAndroidTarget(): string {
308+
let installedTargets = this.getInstalledTargets();
296309
return _.findLast(AndroidToolsInfo.SUPPORTED_TARGETS.sort(), supportedTarget => _.includes(installedTargets, supportedTarget));
297310
}
298311

299312
private parseAndroidSdkString(androidSdkString: string): number {
300313
return parseInt(androidSdkString.replace(`${AndroidToolsInfo.ANDROID_TARGET_PREFIX}-`, ""));
301314
}
302315

303-
private async getInstalledTargets(): Promise<string[]> {
316+
private getInstalledTargets(): string[] {
304317
if (!this.installedTargetsCache) {
305318
try {
306319
const pathToInstalledTargets = path.join(this.androidHome, "platforms");

lib/declarations.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,14 @@ interface IAndroidToolsInfo {
220220
* and ANDROID_HOME environement variable.
221221
* @return {IAndroidToolsInfoData} Information about installed Android Tools and SDKs.
222222
*/
223-
getToolsInfo(): Promise<IAndroidToolsInfoData>;
223+
getToolsInfo(): IAndroidToolsInfoData;
224224

225225
/**
226226
* Validates the information about required Android tools and SDK versions.
227227
* @param {any} options Defines if the warning messages should treated as error and if the targetSdk value should be validated as well.
228228
* @return {boolean} True if there are detected issues, false otherwise.
229229
*/
230-
validateInfo(options?: { showWarningsAsErrors: boolean, validateTargetSdk: boolean }): Promise<boolean>;
230+
validateInfo(options?: { showWarningsAsErrors: boolean, validateTargetSdk: boolean }): boolean;
231231

232232
/**
233233
* Validates the information about required JAVA version.

lib/definitions/project.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ interface IPlatformProjectService extends NodeJS.EventEmitter {
160160
validate(projectData: IProjectData): Promise<void>;
161161
createProject(frameworkDir: string, frameworkVersion: string, projectData: IProjectData, pathToTemplate?: string): Promise<void>;
162162
interpolateData(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): Promise<void>;
163-
interpolateConfigurationFile(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): Promise<void>;
163+
interpolateConfigurationFile(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): void;
164164

165165
/**
166166
* Executes additional actions after native project is created.

lib/services/android-project-service.ts

+11-10
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
103103
}
104104

105105
this.$fs.ensureDirectoryExists(this.getPlatformData(projectData).projectRoot);
106-
await this.$androidToolsInfo.validateInfo({ showWarningsAsErrors: true, validateTargetSdk: true });
107-
let androidToolsInfo = await this.$androidToolsInfo.getToolsInfo();
106+
this.$androidToolsInfo.validateInfo({ showWarningsAsErrors: true, validateTargetSdk: true });
107+
let androidToolsInfo = this.$androidToolsInfo.getToolsInfo();
108108
let targetSdkVersion = androidToolsInfo.targetSdkVersion;
109109
this.$logger.trace(`Using Android SDK '${targetSdkVersion}'.`);
110110
this.copy(this.getPlatformData(projectData).projectRoot, frameworkDir, "libs", "-R");
@@ -184,7 +184,7 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
184184

185185
public async interpolateData(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): Promise<void> {
186186
// Interpolate the apilevel and package
187-
await this.interpolateConfigurationFile(projectData, platformSpecificData);
187+
this.interpolateConfigurationFile(projectData, platformSpecificData);
188188

189189
let stringsFilePath = path.join(this.getAppResourcesDestinationDirectoryPath(projectData), 'values', 'strings.xml');
190190
shell.sed('-i', /__NAME__/, projectData.projectName, stringsFilePath);
@@ -203,10 +203,11 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
203203
}
204204
}
205205

206-
public async interpolateConfigurationFile(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): Promise<void> {
206+
// TODO: Check if we can make this method sync.
207+
public interpolateConfigurationFile(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): void {
207208
let manifestPath = this.getPlatformData(projectData).configurationFilePath;
208209
shell.sed('-i', /__PACKAGE__/, projectData.projectId, manifestPath);
209-
const sdk = (platformSpecificData && platformSpecificData.sdk) || (await this.$androidToolsInfo.getToolsInfo()).compileSdkVersion.toString();
210+
const sdk = (platformSpecificData && platformSpecificData.sdk) || this.$androidToolsInfo.getToolsInfo().compileSdkVersion.toString();
210211
shell.sed('-i', /__APILEVEL__/, sdk, manifestPath);
211212
}
212213

@@ -241,7 +242,7 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
241242

242243
public async buildProject(projectRoot: string, projectData: IProjectData, buildConfig: IBuildConfig): Promise<void> {
243244
if (this.canUseGradle(projectData)) {
244-
let buildOptions = await this.getBuildOptions(buildConfig, projectData);
245+
let buildOptions = this.getBuildOptions(buildConfig, projectData);
245246
if (this.$logger.getLevel() === "TRACE") {
246247
buildOptions.unshift("--stacktrace");
247248
buildOptions.unshift("--debug");
@@ -265,10 +266,10 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
265266
}
266267
}
267268

268-
private async getBuildOptions(settings: IAndroidBuildOptionsSettings, projectData: IProjectData): Promise<Array<string>> {
269-
await this.$androidToolsInfo.validateInfo({ showWarningsAsErrors: true, validateTargetSdk: true });
269+
private getBuildOptions(settings: IAndroidBuildOptionsSettings, projectData: IProjectData): Array<string> {
270+
this.$androidToolsInfo.validateInfo({ showWarningsAsErrors: true, validateTargetSdk: true });
270271

271-
let androidToolsInfo = await this.$androidToolsInfo.getToolsInfo();
272+
let androidToolsInfo = this.$androidToolsInfo.getToolsInfo();
272273
let compileSdk = androidToolsInfo.compileSdkVersion;
273274
let targetSdk = this.getTargetFromAndroidManifest(projectData) || compileSdk;
274275
let buildToolsVersion = androidToolsInfo.buildToolsVersion;
@@ -400,7 +401,7 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
400401
}
401402

402403
// We don't need release options here
403-
let buildOptions = await this.getBuildOptions({ release: false }, projectData);
404+
let buildOptions = this.getBuildOptions({ release: false }, projectData);
404405

405406
let projectRoot = this.getPlatformData(projectData).projectRoot;
406407

lib/services/doctor-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class DoctorService implements IDoctorService {
103103
this.$logger.out("To be able to work with iOS devices and projects, you need Mac OS X Mavericks or later." + EOL);
104104
}
105105

106-
let androidToolsIssues = await this.$androidToolsInfo.validateInfo();
106+
let androidToolsIssues = this.$androidToolsInfo.validateInfo();
107107
let javaVersionIssue = await this.$androidToolsInfo.validateJavacVersion(sysInfo.javacVersion);
108108
let doctorResult = result || androidToolsIssues || javaVersionIssue;
109109

lib/services/ios-project-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
161161
this.replaceFileContent(pbxprojFilePath, projectData);
162162
}
163163

164-
public interpolateConfigurationFile(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): Promise<void> {
165-
return Promise.resolve();
164+
public interpolateConfigurationFile(projectData: IProjectData, platformSpecificData: IPlatformSpecificData): void {
165+
return undefined;
166166
}
167167

168168
public afterCreateProject(projectRoot: string, projectData: IProjectData): void {

lib/services/platform-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ export class PlatformService extends EventEmitter implements IPlatformService {
287287
await platformData.platformProjectService.processConfigurationFilesFromAppResources(appFilesUpdaterOptions.release, projectData);
288288
}
289289

290-
await platformData.platformProjectService.interpolateConfigurationFile(projectData, platformSpecificData);
290+
platformData.platformProjectService.interpolateConfigurationFile(projectData, platformSpecificData);
291291

292292
this.$logger.out("Project successfully prepared (" + platform + ")");
293293
}

test/npm-support.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ async function setupProject(dependencies?: any): Promise<any> {
157157
getAppResourcesDestinationDirectoryPath: () => path.join(androidFolderPath, "src", "main", "res"),
158158
processConfigurationFilesFromAppResources: () => Promise.resolve(),
159159
ensureConfigurationFileInAppResources: (): any => null,
160-
interpolateConfigurationFile: () => Promise.resolve(),
160+
interpolateConfigurationFile: (): void => undefined,
161161
isPlatformPrepared: (projectRoot: string) => false
162162
}
163163
};

test/platform-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ describe('Platform Service Tests', () => {
325325
getAppResourcesDestinationDirectoryPath: () => "",
326326
processConfigurationFilesFromAppResources: () => Promise.resolve(),
327327
ensureConfigurationFileInAppResources: (): any => null,
328-
interpolateConfigurationFile: () => Promise.resolve(),
328+
interpolateConfigurationFile: (): void => undefined,
329329
isPlatformPrepared: (projectRoot: string) => false
330330
}
331331
};
@@ -398,7 +398,7 @@ describe('Platform Service Tests', () => {
398398
getAppResourcesDestinationDirectoryPath: () => "",
399399
processConfigurationFilesFromAppResources: () => Promise.resolve(),
400400
ensureConfigurationFileInAppResources: (): any => null,
401-
interpolateConfigurationFile: () => Promise.resolve(),
401+
interpolateConfigurationFile: (): void => undefined,
402402
isPlatformPrepared: (projectRoot: string) => false
403403
}
404404
};

test/stubs.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ export class PlatformProjectServiceStub extends EventEmitter implements IPlatfor
298298
async interpolateData(): Promise<void> {
299299
return Promise.resolve();
300300
}
301-
async interpolateConfigurationFile(): Promise<void> {
302-
return Promise.resolve();
301+
interpolateConfigurationFile(): void {
302+
return ;
303303
}
304304
afterCreateProject(projectRoot: string): void {
305305
return null;
@@ -489,7 +489,7 @@ export class LiveSyncServiceStub implements ILiveSyncService {
489489
}
490490

491491
export class AndroidToolsInfoStub implements IAndroidToolsInfo {
492-
public async getToolsInfo(): Promise<IAndroidToolsInfoData> {
492+
public getToolsInfo(): IAndroidToolsInfoData {
493493
let infoData: IAndroidToolsInfoData = Object.create(null);
494494
infoData.androidHomeEnvVar = "";
495495
infoData.compileSdkVersion = 23;
@@ -499,7 +499,7 @@ export class AndroidToolsInfoStub implements IAndroidToolsInfo {
499499
return infoData;
500500
}
501501

502-
public async validateInfo(options?: { showWarningsAsErrors: boolean, validateTargetSdk: boolean }): Promise<boolean> {
502+
public validateInfo(options?: { showWarningsAsErrors: boolean, validateTargetSdk: boolean }): boolean {
503503
return true;
504504
}
505505

0 commit comments

Comments
 (0)