You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
601 lines
14 KiB
601 lines
14 KiB
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.getAndroidModFileProviders = getAndroidModFileProviders;
|
|
exports.sortAndroidManifest = sortAndroidManifest;
|
|
exports.withAndroidBaseMods = withAndroidBaseMods;
|
|
|
|
function _fs() {
|
|
const data = require("fs");
|
|
|
|
_fs = function () {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
function _path() {
|
|
const data = _interopRequireDefault(require("path"));
|
|
|
|
_path = function () {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
function _android() {
|
|
const data = require("../android");
|
|
|
|
_android = function () {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
function _XML() {
|
|
const data = require("../utils/XML");
|
|
|
|
_XML = function () {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
function _sortObject() {
|
|
const data = require("../utils/sortObject");
|
|
|
|
_sortObject = function () {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
function _createBaseMod() {
|
|
const data = require("./createBaseMod");
|
|
|
|
_createBaseMod = function () {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
const {
|
|
readFile,
|
|
writeFile
|
|
} = _fs().promises;
|
|
|
|
function getAndroidManifestTemplate(config) {
|
|
var _config$android$packa, _config$android;
|
|
|
|
// Keep in sync with https://github.com/expo/expo/blob/master/templates/expo-template-bare-minimum/android/app/src/main/AndroidManifest.xml
|
|
// TODO: Read from remote template when possible
|
|
return (0, _XML().parseXMLAsync)(`
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="${(_config$android$packa = (_config$android = config.android) === null || _config$android === void 0 ? void 0 : _config$android.package) !== null && _config$android$packa !== void 0 ? _config$android$packa : 'com.placeholder.appid'}">
|
|
|
|
<uses-permission android:name="android.permission.INTERNET"/>
|
|
<!-- OPTIONAL PERMISSIONS, REMOVE WHATEVER YOU DO NOT NEED -->
|
|
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
|
<!-- These require runtime permissions on M -->
|
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
|
<!-- END OPTIONAL PERMISSIONS -->
|
|
|
|
<queries>
|
|
<!-- Support checking for http(s) links via the Linking API -->
|
|
<intent>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
<data android:scheme="https" />
|
|
</intent>
|
|
</queries>
|
|
|
|
<application
|
|
android:name=".MainApplication"
|
|
android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher"
|
|
android:roundIcon="@mipmap/ic_launcher_round"
|
|
android:allowBackup="false"
|
|
android:theme="@style/AppTheme"
|
|
android:usesCleartextTraffic="true"
|
|
>
|
|
<meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="YOUR-APP-URL-HERE"/>
|
|
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="YOUR-APP-SDK-VERSION-HERE"/>
|
|
<activity
|
|
android:name=".MainActivity"
|
|
android:label="@string/app_name"
|
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
|
|
android:launchMode="singleTask"
|
|
android:windowSoftInputMode="adjustResize"
|
|
android:theme="@style/Theme.App.SplashScreen"
|
|
>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN"/>
|
|
<category android:name="android.intent.category.LAUNCHER"/>
|
|
</intent-filter>
|
|
</activity>
|
|
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
|
|
</application>
|
|
</manifest>
|
|
`);
|
|
}
|
|
|
|
function sortAndroidManifest(obj) {
|
|
if (obj.manifest) {
|
|
// Reverse sort so application is last and permissions are first
|
|
obj.manifest = (0, _sortObject().sortObject)(obj.manifest, _sortObject().reverseSortString);
|
|
|
|
if (Array.isArray(obj.manifest['uses-permission'])) {
|
|
// Sort permissions alphabetically
|
|
obj.manifest['uses-permission'].sort((a, b) => {
|
|
if (a.$['android:name'] < b.$['android:name']) return -1;
|
|
if (a.$['android:name'] > b.$['android:name']) return 1;
|
|
return 0;
|
|
});
|
|
}
|
|
|
|
if (Array.isArray(obj.manifest.application)) {
|
|
// reverse sort applications so activity is towards the end and meta-data is towards the front.
|
|
obj.manifest.application = obj.manifest.application.map(application => {
|
|
application = (0, _sortObject().sortObjWithOrder)(application, ['meta-data', 'service', 'activity']);
|
|
|
|
if (Array.isArray(application['meta-data'])) {
|
|
// Sort metadata alphabetically
|
|
application['meta-data'].sort((a, b) => {
|
|
if (a.$['android:name'] < b.$['android:name']) return -1;
|
|
if (a.$['android:name'] > b.$['android:name']) return 1;
|
|
return 0;
|
|
});
|
|
}
|
|
|
|
return application;
|
|
});
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
const defaultProviders = {
|
|
dangerous: (0, _createBaseMod().provider)({
|
|
getFilePath() {
|
|
return '';
|
|
},
|
|
|
|
async read() {
|
|
return {
|
|
filePath: '',
|
|
modResults: {}
|
|
};
|
|
},
|
|
|
|
async write() {}
|
|
|
|
}),
|
|
// Append a rule to supply gradle.properties data to mods on `mods.android.gradleProperties`
|
|
manifest: (0, _createBaseMod().provider)({
|
|
isIntrospective: true,
|
|
|
|
getFilePath({
|
|
modRequest: {
|
|
platformProjectRoot
|
|
}
|
|
}) {
|
|
return _path().default.join(platformProjectRoot, 'app/src/main/AndroidManifest.xml');
|
|
},
|
|
|
|
async read(filePath, config) {
|
|
try {
|
|
return await _android().Manifest.readAndroidManifestAsync(filePath);
|
|
} catch (error) {
|
|
if (!config.modRequest.introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return await getAndroidManifestTemplate(config);
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults,
|
|
modRequest: {
|
|
introspect
|
|
}
|
|
}) {
|
|
if (introspect) return;
|
|
await _android().Manifest.writeAndroidManifestAsync(filePath, sortAndroidManifest(modResults));
|
|
}
|
|
|
|
}),
|
|
// Append a rule to supply gradle.properties data to mods on `mods.android.gradleProperties`
|
|
gradleProperties: (0, _createBaseMod().provider)({
|
|
isIntrospective: true,
|
|
|
|
getFilePath({
|
|
modRequest: {
|
|
platformProjectRoot
|
|
}
|
|
}) {
|
|
return _path().default.join(platformProjectRoot, 'gradle.properties');
|
|
},
|
|
|
|
async read(filePath, config) {
|
|
try {
|
|
return await _android().Properties.parsePropertiesFile(await readFile(filePath, 'utf8'));
|
|
} catch (error) {
|
|
if (!config.modRequest.introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return [];
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults,
|
|
modRequest: {
|
|
introspect
|
|
}
|
|
}) {
|
|
if (introspect) return;
|
|
await writeFile(filePath, _android().Properties.propertiesListToString(modResults));
|
|
}
|
|
|
|
}),
|
|
// Append a rule to supply strings.xml data to mods on `mods.android.strings`
|
|
strings: (0, _createBaseMod().provider)({
|
|
isIntrospective: true,
|
|
|
|
async getFilePath({
|
|
modRequest: {
|
|
projectRoot,
|
|
introspect
|
|
}
|
|
}) {
|
|
try {
|
|
return await _android().Strings.getProjectStringsXMLPathAsync(projectRoot);
|
|
} catch (error) {
|
|
if (!introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
},
|
|
|
|
async read(filePath, config) {
|
|
try {
|
|
return await _android().Resources.readResourcesXMLAsync({
|
|
path: filePath
|
|
});
|
|
} catch (error) {
|
|
if (!config.modRequest.introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return {
|
|
resources: {}
|
|
};
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults,
|
|
modRequest: {
|
|
introspect
|
|
}
|
|
}) {
|
|
if (introspect) return;
|
|
await (0, _XML().writeXMLAsync)({
|
|
path: filePath,
|
|
xml: modResults
|
|
});
|
|
}
|
|
|
|
}),
|
|
colors: (0, _createBaseMod().provider)({
|
|
isIntrospective: true,
|
|
|
|
async getFilePath({
|
|
modRequest: {
|
|
projectRoot,
|
|
introspect
|
|
}
|
|
}) {
|
|
try {
|
|
return await _android().Colors.getProjectColorsXMLPathAsync(projectRoot);
|
|
} catch (error) {
|
|
if (!introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
},
|
|
|
|
async read(filePath, {
|
|
modRequest: {
|
|
introspect
|
|
}
|
|
}) {
|
|
try {
|
|
return await _android().Resources.readResourcesXMLAsync({
|
|
path: filePath
|
|
});
|
|
} catch (error) {
|
|
if (!introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return {
|
|
resources: {}
|
|
};
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults,
|
|
modRequest: {
|
|
introspect
|
|
}
|
|
}) {
|
|
if (introspect) return;
|
|
await (0, _XML().writeXMLAsync)({
|
|
path: filePath,
|
|
xml: modResults
|
|
});
|
|
}
|
|
|
|
}),
|
|
colorsNight: (0, _createBaseMod().provider)({
|
|
isIntrospective: true,
|
|
|
|
async getFilePath({
|
|
modRequest: {
|
|
projectRoot,
|
|
introspect
|
|
}
|
|
}) {
|
|
try {
|
|
return await _android().Colors.getProjectColorsXMLPathAsync(projectRoot, {
|
|
kind: 'values-night'
|
|
});
|
|
} catch (error) {
|
|
if (!introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
},
|
|
|
|
async read(filePath, config) {
|
|
try {
|
|
return await _android().Resources.readResourcesXMLAsync({
|
|
path: filePath
|
|
});
|
|
} catch (error) {
|
|
if (!config.modRequest.introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return {
|
|
resources: {}
|
|
};
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults,
|
|
modRequest: {
|
|
introspect
|
|
}
|
|
}) {
|
|
if (introspect) return;
|
|
await (0, _XML().writeXMLAsync)({
|
|
path: filePath,
|
|
xml: modResults
|
|
});
|
|
}
|
|
|
|
}),
|
|
styles: (0, _createBaseMod().provider)({
|
|
isIntrospective: true,
|
|
|
|
async getFilePath({
|
|
modRequest: {
|
|
projectRoot,
|
|
introspect
|
|
}
|
|
}) {
|
|
try {
|
|
return await _android().Styles.getProjectStylesXMLPathAsync(projectRoot);
|
|
} catch (error) {
|
|
if (!introspect) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
},
|
|
|
|
async read(filePath, config) {
|
|
var _styles$resources$$;
|
|
|
|
let styles = {
|
|
resources: {}
|
|
};
|
|
|
|
try {
|
|
// Adds support for `tools:x`
|
|
styles = await _android().Resources.readResourcesXMLAsync({
|
|
path: filePath,
|
|
fallback: `<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools"></resources>`
|
|
});
|
|
} catch (error) {
|
|
if (!config.modRequest.introspect) {
|
|
throw error;
|
|
}
|
|
} // Ensure support for tools is added...
|
|
|
|
|
|
if (!styles.resources.$) {
|
|
styles.resources.$ = {};
|
|
}
|
|
|
|
if (!((_styles$resources$$ = styles.resources.$) !== null && _styles$resources$$ !== void 0 && _styles$resources$$['xmlns:tools'])) {
|
|
styles.resources.$['xmlns:tools'] = 'http://schemas.android.com/tools';
|
|
}
|
|
|
|
return styles;
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults,
|
|
modRequest: {
|
|
introspect
|
|
}
|
|
}) {
|
|
if (introspect) return;
|
|
await (0, _XML().writeXMLAsync)({
|
|
path: filePath,
|
|
xml: modResults
|
|
});
|
|
}
|
|
|
|
}),
|
|
projectBuildGradle: (0, _createBaseMod().provider)({
|
|
getFilePath({
|
|
modRequest: {
|
|
projectRoot
|
|
}
|
|
}) {
|
|
return _android().Paths.getProjectBuildGradleFilePath(projectRoot);
|
|
},
|
|
|
|
async read(filePath) {
|
|
return _android().Paths.getFileInfo(filePath);
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults: {
|
|
contents
|
|
}
|
|
}) {
|
|
await writeFile(filePath, contents);
|
|
}
|
|
|
|
}),
|
|
settingsGradle: (0, _createBaseMod().provider)({
|
|
getFilePath({
|
|
modRequest: {
|
|
projectRoot
|
|
}
|
|
}) {
|
|
return _android().Paths.getSettingsGradleFilePath(projectRoot);
|
|
},
|
|
|
|
async read(filePath) {
|
|
return _android().Paths.getFileInfo(filePath);
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults: {
|
|
contents
|
|
}
|
|
}) {
|
|
await writeFile(filePath, contents);
|
|
}
|
|
|
|
}),
|
|
appBuildGradle: (0, _createBaseMod().provider)({
|
|
getFilePath({
|
|
modRequest: {
|
|
projectRoot
|
|
}
|
|
}) {
|
|
return _android().Paths.getAppBuildGradleFilePath(projectRoot);
|
|
},
|
|
|
|
async read(filePath) {
|
|
return _android().Paths.getFileInfo(filePath);
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults: {
|
|
contents
|
|
}
|
|
}) {
|
|
await writeFile(filePath, contents);
|
|
}
|
|
|
|
}),
|
|
mainActivity: (0, _createBaseMod().provider)({
|
|
getFilePath({
|
|
modRequest: {
|
|
projectRoot
|
|
}
|
|
}) {
|
|
return _android().Paths.getProjectFilePath(projectRoot, 'MainActivity');
|
|
},
|
|
|
|
async read(filePath) {
|
|
return _android().Paths.getFileInfo(filePath);
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults: {
|
|
contents
|
|
}
|
|
}) {
|
|
await writeFile(filePath, contents);
|
|
}
|
|
|
|
}),
|
|
mainApplication: (0, _createBaseMod().provider)({
|
|
getFilePath({
|
|
modRequest: {
|
|
projectRoot
|
|
}
|
|
}) {
|
|
return _android().Paths.getProjectFilePath(projectRoot, 'MainApplication');
|
|
},
|
|
|
|
async read(filePath) {
|
|
return _android().Paths.getFileInfo(filePath);
|
|
},
|
|
|
|
async write(filePath, {
|
|
modResults: {
|
|
contents
|
|
}
|
|
}) {
|
|
await writeFile(filePath, contents);
|
|
}
|
|
|
|
})
|
|
};
|
|
|
|
function withAndroidBaseMods(config, {
|
|
providers,
|
|
...props
|
|
} = {}) {
|
|
return (0, _createBaseMod().withGeneratedBaseMods)(config, { ...props,
|
|
platform: 'android',
|
|
providers: providers !== null && providers !== void 0 ? providers : getAndroidModFileProviders()
|
|
});
|
|
}
|
|
|
|
function getAndroidModFileProviders() {
|
|
return defaultProviders;
|
|
}
|
|
//# sourceMappingURL=withAndroidBaseMods.js.map
|