Skip to content

Commit f800172

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 067255c commit f800172

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)