Skip to content

Commit ec546e9

Browse files
Some improvements for AndroidManifest in App_Resources
* Correct the code, so AndroidManifest will not be backed up in case we are unable to find the manifest in the template (current code was always creating the backup and reverting it in case it fails on the extraction from template). * Fix backup name - use guid in case AndroidManifest.backup exists.
1 parent 8c20836 commit ec546e9

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
@@ -8,6 +8,7 @@ import * as semver from "semver";
88
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";
11+
import { createGUID } from "../common/helpers";
1112

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

289280
// In case we should extract the manifest from default template, but for some reason we cannot, break the execution,
290281
// so the original file from Android runtime will be used.
291282
if(shouldExtractDefaultManifest && !this.extractAndroidManifestFromDefaultTemplate(originalAndroidManifestFilePath).wait()) {
292-
// now revert back
293-
this.revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
294283
return;
295284
}
296285

297-
if(isAndroidManifestBackedUp) {
298-
this.$logger.warn(`Your ${this.platformData.configurationFileName} in app/App_Resources/Android will be replaced by the default one from hello-world template.`);
299-
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.`);
300-
}
301-
302286
// Overwrite the AndroidManifest from runtime.
303287
this.$fs.copyFile(originalAndroidManifestFilePath, this.platformData.configurationFilePath).wait();
304288
}).future<void>()();
@@ -533,20 +517,32 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
533517
}).future<boolean>()();
534518
}
535519

536-
private get configurationFileBackupName(): string {
537-
return this.platformData.configurationFileName + ".backup";
520+
private _configurationFileBackupName: string;
521+
522+
private getConfigurationFileBackupName(originalAndroidManifestFilePath: string): IFuture<string> {
523+
return (() => {
524+
if(!this._configurationFileBackupName) {
525+
let defaultBackupName = this.platformData.configurationFileName + ".backup";
526+
if(this.$fs.exists(path.join(path.dirname(originalAndroidManifestFilePath), defaultBackupName)).wait()) {
527+
defaultBackupName += `_${createGUID(false)}`;
528+
}
529+
this._configurationFileBackupName = defaultBackupName;
530+
}
531+
532+
return this._configurationFileBackupName;
533+
}).future<string>()();
538534
}
539535

540536
private backupOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
541537
return (() => {
542-
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
538+
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
543539
shell.mv(originalAndroidManifestFilePath, newPathForOriginalManifest);
544540
}).future<void>()();
545541
}
546542

547543
private revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
548544
return (() => {
549-
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
545+
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
550546
if(this.$fs.exists(pathToBackupFile).wait()) {
551547
this.$logger.trace(`Could not extract ${this.platformData.configurationFileName} from default template. Reverting the change of your app/App_Resources/${this.platformData.configurationFileName}.`);
552548
shell.mv(pathToBackupFile, originalAndroidManifestFilePath);
@@ -558,19 +554,29 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
558554
return ((): boolean => {
559555
let defaultTemplatePath = this.$projectTemplatesService.defaultTemplatePath.wait();
560556
let templateAndroidManifest = path.join(defaultTemplatePath, constants.APP_RESOURCES_FOLDER_NAME, this.$devicePlatformsConstants.Android, this.platformData.configurationFileName);
557+
let alreadyHasAndroidManifest = this.$fs.exists(originalAndroidManifestFilePath).wait();
561558
if (this.$fs.exists(templateAndroidManifest).wait()) {
562559
this.$logger.trace(`${originalAndroidManifestFilePath} is missing. Upgrading the source of the project with one from the new project template. Copy ${templateAndroidManifest} to ${originalAndroidManifestFilePath}`);
563560
try {
561+
if(alreadyHasAndroidManifest) {
562+
this.backupOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
563+
}
564564
this.$fs.copyFile(templateAndroidManifest, originalAndroidManifestFilePath).wait();
565565
} catch(e) {
566566
this.$logger.trace(`Copying template's ${this.platformData.configurationFileName} failed. `, e);
567+
this.revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
567568
return false;
568569
}
569570
} else {
570571
this.$logger.trace(`${originalAndroidManifestFilePath} is missing but the template ${templateAndroidManifest} is missing too, can not upgrade ${this.platformData.configurationFileName}.`);
571572
return false;
572573
}
573574

575+
if(alreadyHasAndroidManifest) {
576+
this.$logger.warn(`Your ${this.platformData.configurationFileName} in app/App_Resources/Android will be replaced by the default one from hello-world template.`);
577+
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.`);
578+
}
579+
574580
this.interpolateConfigurationFile().wait();
575581
return true;
576582
}).future<boolean>()();

0 commit comments

Comments
 (0)