Skip to content

Commit 7853fe5

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 7853fe5

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

lib/services/android-project-service.ts

+28-21
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,15 @@ 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+
shouldExtractDefaultManifest = !hasAndroidManifestInAppResources || !this.isAndroidManifestFileCorrect(originalAndroidManifestFilePath).wait(),
278279
isAndroidManifestBackedUp = false;
279280

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-
}
288-
289281
// In case we should extract the manifest from default template, but for some reason we cannot, break the execution,
290282
// so the original file from Android runtime will be used.
291283
if(shouldExtractDefaultManifest && !this.extractAndroidManifestFromDefaultTemplate(originalAndroidManifestFilePath).wait()) {
292-
// now revert back
293-
this.revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
294284
return;
295285
}
296286

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-
302287
// Overwrite the AndroidManifest from runtime.
303288
this.$fs.copyFile(originalAndroidManifestFilePath, this.platformData.configurationFilePath).wait();
304289
}).future<void>()();
@@ -533,20 +518,32 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
533518
}).future<boolean>()();
534519
}
535520

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

540537
private backupOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
541538
return (() => {
542-
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
539+
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
543540
shell.mv(originalAndroidManifestFilePath, newPathForOriginalManifest);
544541
}).future<void>()();
545542
}
546543

547544
private revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
548545
return (() => {
549-
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
546+
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
550547
if(this.$fs.exists(pathToBackupFile).wait()) {
551548
this.$logger.trace(`Could not extract ${this.platformData.configurationFileName} from default template. Reverting the change of your app/App_Resources/${this.platformData.configurationFileName}.`);
552549
shell.mv(pathToBackupFile, originalAndroidManifestFilePath);
@@ -558,19 +555,29 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
558555
return ((): boolean => {
559556
let defaultTemplatePath = this.$projectTemplatesService.defaultTemplatePath.wait();
560557
let templateAndroidManifest = path.join(defaultTemplatePath, constants.APP_RESOURCES_FOLDER_NAME, this.$devicePlatformsConstants.Android, this.platformData.configurationFileName);
558+
let alreadyHasAndroidManifest = this.$fs.exists(originalAndroidManifestFilePath).wait();
561559
if (this.$fs.exists(templateAndroidManifest).wait()) {
562560
this.$logger.trace(`${originalAndroidManifestFilePath} is missing. Upgrading the source of the project with one from the new project template. Copy ${templateAndroidManifest} to ${originalAndroidManifestFilePath}`);
563561
try {
562+
if(alreadyHasAndroidManifest) {
563+
this.backupOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
564+
}
564565
this.$fs.copyFile(templateAndroidManifest, originalAndroidManifestFilePath).wait();
565566
} catch(e) {
566567
this.$logger.trace(`Copying template's ${this.platformData.configurationFileName} failed. `, e);
568+
this.revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
567569
return false;
568570
}
569571
} else {
570572
this.$logger.trace(`${originalAndroidManifestFilePath} is missing but the template ${templateAndroidManifest} is missing too, can not upgrade ${this.platformData.configurationFileName}.`);
571573
return false;
572574
}
573575

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

0 commit comments

Comments
 (0)