Skip to content

Commit 96e3cb5

Browse files
Merge pull request #1468 from NativeScript/vladimirov/fix-android-manifest-again
Some improvements for AndroidManifest in App_Resources
2 parents 067255c + f800172 commit 96e3cb5

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

lib/services/android-project-service.ts

+28-22
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import * as projectServiceBaseLib from "./platform-project-service-base";
99
import * as androidDebugBridgePath from "../common/mobile/android/android-debug-bridge";
1010
import {AndroidDeviceHashService} from "../common/mobile/android/android-device-hash-service";
1111
import {EOL} from "os";
12+
import { createGUID } from "../common/helpers";
1213

1314
export class AndroidProjectService extends projectServiceBaseLib.PlatformProjectServiceBase implements IPlatformProjectService {
1415
private static VALUES_DIRNAME = "values";
@@ -271,31 +272,14 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
271272
return (() => {
272273
let originalAndroidManifestFilePath = path.join(this.$projectData.appResourcesDirectoryPath, this.$devicePlatformsConstants.Android, this.platformData.configurationFileName),
273274
hasAndroidManifestInAppResources = this.$fs.exists(originalAndroidManifestFilePath).wait(),
274-
shouldExtractDefaultManifest = !hasAndroidManifestInAppResources,
275-
isAndroidManifestBackedUp = false;
276-
277-
if(hasAndroidManifestInAppResources) {
278-
let isFileCorrect = this.isAndroidManifestFileCorrect(originalAndroidManifestFilePath).wait();
279-
if(!isFileCorrect) {
280-
shouldExtractDefaultManifest = true;
281-
isAndroidManifestBackedUp = true;
282-
this.backupOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
283-
}
284-
}
275+
shouldExtractDefaultManifest = !hasAndroidManifestInAppResources || !this.isAndroidManifestFileCorrect(originalAndroidManifestFilePath).wait();
285276

286277
// In case we should extract the manifest from default template, but for some reason we cannot, break the execution,
287278
// so the original file from Android runtime will be used.
288279
if(shouldExtractDefaultManifest && !this.extractAndroidManifestFromDefaultTemplate(originalAndroidManifestFilePath).wait()) {
289-
// now revert back
290-
this.revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
291280
return;
292281
}
293282

294-
if(isAndroidManifestBackedUp) {
295-
this.$logger.warn(`Your ${this.platformData.configurationFileName} in app/App_Resources/Android will be replaced by the default one from hello-world template.`);
296-
this.$logger.printMarkdown(`The original file will be moved to \`${this.configurationFileBackupName}\`. Merge it **manually** with the new \`${this.platformData.configurationFileName}\` in your app/App_Resources/Android.`);
297-
}
298-
299283
// Overwrite the AndroidManifest from runtime.
300284
this.$fs.copyFile(originalAndroidManifestFilePath, this.platformData.configurationFilePath).wait();
301285
}).future<void>()();
@@ -494,20 +478,32 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
494478
}).future<boolean>()();
495479
}
496480

497-
private get configurationFileBackupName(): string {
498-
return this.platformData.configurationFileName + ".backup";
481+
private _configurationFileBackupName: string;
482+
483+
private getConfigurationFileBackupName(originalAndroidManifestFilePath: string): IFuture<string> {
484+
return (() => {
485+
if(!this._configurationFileBackupName) {
486+
let defaultBackupName = this.platformData.configurationFileName + ".backup";
487+
if(this.$fs.exists(path.join(path.dirname(originalAndroidManifestFilePath), defaultBackupName)).wait()) {
488+
defaultBackupName += `_${createGUID(false)}`;
489+
}
490+
this._configurationFileBackupName = defaultBackupName;
491+
}
492+
493+
return this._configurationFileBackupName;
494+
}).future<string>()();
499495
}
500496

501497
private backupOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
502498
return (() => {
503-
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
499+
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
504500
shell.mv(originalAndroidManifestFilePath, newPathForOriginalManifest);
505501
}).future<void>()();
506502
}
507503

508504
private revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
509505
return (() => {
510-
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
506+
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
511507
if(this.$fs.exists(pathToBackupFile).wait()) {
512508
this.$logger.trace(`Could not extract ${this.platformData.configurationFileName} from default template. Reverting the change of your app/App_Resources/${this.platformData.configurationFileName}.`);
513509
shell.mv(pathToBackupFile, originalAndroidManifestFilePath);
@@ -519,19 +515,29 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
519515
return ((): boolean => {
520516
let defaultTemplatePath = this.$projectTemplatesService.defaultTemplatePath.wait();
521517
let templateAndroidManifest = path.join(defaultTemplatePath, constants.APP_RESOURCES_FOLDER_NAME, this.$devicePlatformsConstants.Android, this.platformData.configurationFileName);
518+
let alreadyHasAndroidManifest = this.$fs.exists(originalAndroidManifestFilePath).wait();
522519
if (this.$fs.exists(templateAndroidManifest).wait()) {
523520
this.$logger.trace(`${originalAndroidManifestFilePath} is missing. Upgrading the source of the project with one from the new project template. Copy ${templateAndroidManifest} to ${originalAndroidManifestFilePath}`);
524521
try {
522+
if(alreadyHasAndroidManifest) {
523+
this.backupOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
524+
}
525525
this.$fs.copyFile(templateAndroidManifest, originalAndroidManifestFilePath).wait();
526526
} catch(e) {
527527
this.$logger.trace(`Copying template's ${this.platformData.configurationFileName} failed. `, e);
528+
this.revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
528529
return false;
529530
}
530531
} else {
531532
this.$logger.trace(`${originalAndroidManifestFilePath} is missing but the template ${templateAndroidManifest} is missing too, can not upgrade ${this.platformData.configurationFileName}.`);
532533
return false;
533534
}
534535

536+
if(alreadyHasAndroidManifest) {
537+
this.$logger.warn(`Your ${this.platformData.configurationFileName} in app/App_Resources/Android will be replaced by the default one from hello-world template.`);
538+
this.$logger.printMarkdown(`The original file will be moved to \`${this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait()}\`. Merge it **manually** with the new \`${this.platformData.configurationFileName}\` in your app/App_Resources/Android.`);
539+
}
540+
535541
this.interpolateConfigurationFile().wait();
536542
return true;
537543
}).future<boolean>()();

0 commit comments

Comments
 (0)