Skip to content

Some improvements for AndroidManifest in App_Resources #1468

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 11, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 28 additions & 22 deletions lib/services/android-project-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import * as projectServiceBaseLib from "./platform-project-service-base";
import * as androidDebugBridgePath from "../common/mobile/android/android-debug-bridge";
import {AndroidDeviceHashService} from "../common/mobile/android/android-device-hash-service";
import {EOL} from "os";
import { createGUID } from "../common/helpers";

export class AndroidProjectService extends projectServiceBaseLib.PlatformProjectServiceBase implements IPlatformProjectService {
private static VALUES_DIRNAME = "values";
Expand Down Expand Up @@ -271,31 +272,14 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
return (() => {
let originalAndroidManifestFilePath = path.join(this.$projectData.appResourcesDirectoryPath, this.$devicePlatformsConstants.Android, this.platformData.configurationFileName),
hasAndroidManifestInAppResources = this.$fs.exists(originalAndroidManifestFilePath).wait(),
shouldExtractDefaultManifest = !hasAndroidManifestInAppResources,
isAndroidManifestBackedUp = false;

if(hasAndroidManifestInAppResources) {
let isFileCorrect = this.isAndroidManifestFileCorrect(originalAndroidManifestFilePath).wait();
if(!isFileCorrect) {
shouldExtractDefaultManifest = true;
isAndroidManifestBackedUp = true;
this.backupOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
}
}
shouldExtractDefaultManifest = !hasAndroidManifestInAppResources || !this.isAndroidManifestFileCorrect(originalAndroidManifestFilePath).wait();

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

if(isAndroidManifestBackedUp) {
this.$logger.warn(`Your ${this.platformData.configurationFileName} in app/App_Resources/Android will be replaced by the default one from hello-world template.`);
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.`);
}

// Overwrite the AndroidManifest from runtime.
this.$fs.copyFile(originalAndroidManifestFilePath, this.platformData.configurationFilePath).wait();
}).future<void>()();
Expand Down Expand Up @@ -494,20 +478,32 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
}).future<boolean>()();
}

private get configurationFileBackupName(): string {
return this.platformData.configurationFileName + ".backup";
private _configurationFileBackupName: string;

private getConfigurationFileBackupName(originalAndroidManifestFilePath: string): IFuture<string> {
return (() => {
if(!this._configurationFileBackupName) {
let defaultBackupName = this.platformData.configurationFileName + ".backup";
if(this.$fs.exists(path.join(path.dirname(originalAndroidManifestFilePath), defaultBackupName)).wait()) {
defaultBackupName += `_${createGUID(false)}`;
}
this._configurationFileBackupName = defaultBackupName;
}

return this._configurationFileBackupName;
}).future<string>()();
}

private backupOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
return (() => {
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
let newPathForOriginalManifest = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
shell.mv(originalAndroidManifestFilePath, newPathForOriginalManifest);
}).future<void>()();
}

private revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath: string): IFuture<void> {
return (() => {
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.configurationFileBackupName);
let pathToBackupFile = path.join(path.dirname(originalAndroidManifestFilePath), this.getConfigurationFileBackupName(originalAndroidManifestFilePath).wait());
if(this.$fs.exists(pathToBackupFile).wait()) {
this.$logger.trace(`Could not extract ${this.platformData.configurationFileName} from default template. Reverting the change of your app/App_Resources/${this.platformData.configurationFileName}.`);
shell.mv(pathToBackupFile, originalAndroidManifestFilePath);
Expand All @@ -519,19 +515,29 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
return ((): boolean => {
let defaultTemplatePath = this.$projectTemplatesService.defaultTemplatePath.wait();
let templateAndroidManifest = path.join(defaultTemplatePath, constants.APP_RESOURCES_FOLDER_NAME, this.$devicePlatformsConstants.Android, this.platformData.configurationFileName);
let alreadyHasAndroidManifest = this.$fs.exists(originalAndroidManifestFilePath).wait();
if (this.$fs.exists(templateAndroidManifest).wait()) {
this.$logger.trace(`${originalAndroidManifestFilePath} is missing. Upgrading the source of the project with one from the new project template. Copy ${templateAndroidManifest} to ${originalAndroidManifestFilePath}`);
try {
if(alreadyHasAndroidManifest) {
this.backupOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
}
this.$fs.copyFile(templateAndroidManifest, originalAndroidManifestFilePath).wait();
} catch(e) {
this.$logger.trace(`Copying template's ${this.platformData.configurationFileName} failed. `, e);
this.revertBackupOfOriginalAndroidManifest(originalAndroidManifestFilePath).wait();
return false;
}
} else {
this.$logger.trace(`${originalAndroidManifestFilePath} is missing but the template ${templateAndroidManifest} is missing too, can not upgrade ${this.platformData.configurationFileName}.`);
return false;
}

if(alreadyHasAndroidManifest) {
this.$logger.warn(`Your ${this.platformData.configurationFileName} in app/App_Resources/Android will be replaced by the default one from hello-world template.`);
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.`);
}

this.interpolateConfigurationFile().wait();
return true;
}).future<boolean>()();
Expand Down