mirror of
https://github.com/expo/config-plugins.git
synced 2026-11-13 20:28:07 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
999cc00275 | ||
|
|
363d36b0bb | ||
|
|
37d11f1867 | ||
|
|
7ecaaf5bd9 |
No files matched your search
@@ -1,3 +1,10 @@
|
||||
### @config-plugins/react-native-callkeep [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* git ignore build folders ([#59](https://github.com/expo/config-plugins/issues/59)) ([d6050be](https://github.com/expo/config-plugins/commit/d6050beb2a5c68dc59287c27ec388c2002ec7904))
|
||||
|
||||
### @config-plugins/react-native-callkeep [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
import { XcodeProject } from "@expo/config-plugins";
|
||||
export declare function ensureHeaderSearchPath(project: XcodeProject, file: string): void;
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ensureHeaderSearchPath = void 0;
|
||||
const COMMENT_KEY = /_comment$/;
|
||||
function unquote(str) {
|
||||
if (str)
|
||||
return str.replace(/^"(.*)"$/, "$1");
|
||||
}
|
||||
function nonComments(obj) {
|
||||
var keys = Object.keys(obj), newObj = {}, i = 0;
|
||||
for (i; i < keys.length; i++) {
|
||||
if (!COMMENT_KEY.test(keys[i])) {
|
||||
newObj[keys[i]] = obj[keys[i]];
|
||||
}
|
||||
}
|
||||
return newObj;
|
||||
}
|
||||
function ensureHeaderSearchPath(project, file) {
|
||||
const configurations = nonComments(project.pbxXCBuildConfigurationSection());
|
||||
const INHERITED = '"$(inherited)"';
|
||||
for (const config in configurations) {
|
||||
const buildSettings = configurations[config].buildSettings;
|
||||
if (unquote(buildSettings["PRODUCT_NAME"]) != project.productName)
|
||||
continue;
|
||||
if (!buildSettings["HEADER_SEARCH_PATHS"]) {
|
||||
buildSettings["HEADER_SEARCH_PATHS"] = [INHERITED];
|
||||
}
|
||||
if (!buildSettings.HEADER_SEARCH_PATHS.includes(file)) {
|
||||
buildSettings["HEADER_SEARCH_PATHS"].push(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.ensureHeaderSearchPath = ensureHeaderSearchPath;
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
declare const withCallkeep: ConfigPlugin;
|
||||
export declare const withXcodeLinkBinaryWithLibraries: ConfigPlugin<{
|
||||
library: string;
|
||||
status?: string;
|
||||
}>;
|
||||
export default withCallkeep;
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withXcodeLinkBinaryWithLibraries = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const ensureHeaderSearchPath_1 = require("./ensureHeaderSearchPath");
|
||||
const withCallkeepHeaderSearchPath = (config) => {
|
||||
const headerSearchPath = `"$(SRCROOT)/../node_modules/react-native-callkeep/ios/RNCallKeep"`;
|
||||
return config_plugins_1.withXcodeProject(config, (config) => {
|
||||
ensureHeaderSearchPath_1.ensureHeaderSearchPath(config.modResults, headerSearchPath);
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withAndroidManifestService = (config) => {
|
||||
return config_plugins_1.withAndroidManifest(config, (config) => {
|
||||
// <service
|
||||
// android:name="io.wazo.callkeep.VoiceConnectionService"
|
||||
// android:label="Wazo"
|
||||
// android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
|
||||
// // Use this to target android >= 11
|
||||
// android:foregroundServiceType="camera|microphone"
|
||||
// // For android < 11
|
||||
// android:foregroundServiceType="phoneCall"
|
||||
// >
|
||||
// <intent-filter>
|
||||
// <action android:name="android.telecom.ConnectionService" />
|
||||
// </intent-filter>
|
||||
// </service>;
|
||||
const app = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
|
||||
if (!Array.isArray(app.service))
|
||||
app.service = [];
|
||||
if (!app.service.find((item) => item.$["android:name"] ===
|
||||
"io.wazo.callkeep.RNCallKeepBackgroundMessagingService")) {
|
||||
app.service.push({
|
||||
$: {
|
||||
"android:name": "io.wazo.callkeep.RNCallKeepBackgroundMessagingService",
|
||||
},
|
||||
});
|
||||
}
|
||||
// TODO: Update item
|
||||
if (!app.service.find((item) => item.$["android:name"] === "io.wazo.callkeep.VoiceConnectionService")) {
|
||||
app.service.push({
|
||||
$: {
|
||||
"android:name": "io.wazo.callkeep.VoiceConnectionService",
|
||||
// @ts-ignore
|
||||
"android:label": "Wazo",
|
||||
"android:permission": "android.permission.BIND_TELECOM_CONNECTION_SERVICE",
|
||||
// Use this to target android >= 11
|
||||
// "android:foregroundServiceType": "camera|microphone",
|
||||
// For android < 11
|
||||
"android:foregroundServiceType": "phoneCall",
|
||||
},
|
||||
"intent-filter": [
|
||||
{
|
||||
action: [
|
||||
{
|
||||
$: {
|
||||
"android:name": "android.telecom.ConnectionService",
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withCallkeep = (config) => {
|
||||
config = config_plugins_1.withInfoPlist(config, (config) => {
|
||||
if (!Array.isArray(config.modResults.UIBackgroundModes)) {
|
||||
config.modResults.UIBackgroundModes = [];
|
||||
}
|
||||
if (!config.modResults.UIBackgroundModes.includes("voip")) {
|
||||
config.modResults.UIBackgroundModes.push("voip");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
config = withCallkeepHeaderSearchPath(config);
|
||||
config = exports.withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "Intents.framework",
|
||||
status: "optional",
|
||||
});
|
||||
config = exports.withXcodeLinkBinaryWithLibraries(config, {
|
||||
library: "CallKit.framework",
|
||||
});
|
||||
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
||||
"android.permission.BIND_TELECOM_CONNECTION_SERVICE",
|
||||
"android.permission.FOREGROUND_SERVICE",
|
||||
"android.permission.READ_PHONE_STATE",
|
||||
"android.permission.CALL_PHONE",
|
||||
]);
|
||||
config = withAndroidManifestService(config);
|
||||
return config;
|
||||
};
|
||||
const withXcodeLinkBinaryWithLibraries = (config, { library, status }) => {
|
||||
return config_plugins_1.withXcodeProject(config, (config) => {
|
||||
const options = status === "optional" ? { weak: true } : {};
|
||||
const target = config_plugins_1.IOSConfig.XcodeUtils.getApplicationNativeTarget({
|
||||
project: config.modResults,
|
||||
projectName: config.modRequest.projectName,
|
||||
});
|
||||
config.modResults.addFramework(library, {
|
||||
target: target.uuid,
|
||||
...options,
|
||||
});
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withXcodeLinkBinaryWithLibraries = withXcodeLinkBinaryWithLibraries;
|
||||
exports.default = withCallkeep;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-callkeep",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin to auto configure callkeep on prebuild",
|
||||
"main": "build/withCallkeep.js",
|
||||
"types": "build/withCallkeep.d.ts",
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
### @config-plugins/react-native-dynamic-app-icon [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* git ignore build folders ([#59](https://github.com/expo/config-plugins/issues/59)) ([d6050be](https://github.com/expo/config-plugins/commit/d6050beb2a5c68dc59287c27ec388c2002ec7904))
|
||||
|
||||
### @config-plugins/react-native-dynamic-app-icon [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
declare type IconSet = Record<string, {
|
||||
image: string;
|
||||
prerendered?: boolean;
|
||||
}>;
|
||||
declare const withDynamicIcon: ConfigPlugin<string[] | IconSet | void>;
|
||||
export default withDynamicIcon;
|
||||
+175
@@ -0,0 +1,175 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const image_utils_1 = require("@expo/image-utils");
|
||||
const fs_1 = __importDefault(require("fs"));
|
||||
const path_1 = __importDefault(require("path"));
|
||||
const folderName = "DynamicAppIcons";
|
||||
const size = 60;
|
||||
const scales = [2, 3];
|
||||
function arrayToImages(images) {
|
||||
return images.reduce((prev, curr, i) => ({ ...prev, [i]: { image: curr } }), {});
|
||||
}
|
||||
const withDynamicIcon = (config, props = {}) => {
|
||||
const _props = props || {};
|
||||
let prepped = {};
|
||||
if (Array.isArray(_props)) {
|
||||
prepped = arrayToImages(_props);
|
||||
}
|
||||
else if (_props) {
|
||||
prepped = _props;
|
||||
}
|
||||
config = withIconXcodeProject(config, { icons: prepped });
|
||||
config = withIconInfoPlist(config, { icons: prepped });
|
||||
config = withIconImages(config, { icons: prepped });
|
||||
return config;
|
||||
};
|
||||
function getIconName(name, size, scale) {
|
||||
const fileName = `${name}-Icon-${size}x${size}`;
|
||||
if (scale != null) {
|
||||
return `${fileName}@${scale}x.png`;
|
||||
}
|
||||
return fileName;
|
||||
}
|
||||
// @ts-ignore
|
||||
const pbxFile_1 = __importDefault(require("xcode/lib/pbxFile"));
|
||||
const withIconXcodeProject = (config, { icons }) => {
|
||||
return config_plugins_1.withXcodeProject(config, async (config) => {
|
||||
const groupPath = `${config.modRequest.projectName}/${folderName}`;
|
||||
const group = config_plugins_1.IOSConfig.XcodeUtils.ensureGroupRecursively(config.modResults, groupPath);
|
||||
const project = config.modResults;
|
||||
const opt = {};
|
||||
// Unlink old assets
|
||||
const groupId = Object.keys(project.hash.project.objects["PBXGroup"]).find((id) => {
|
||||
const _group = project.hash.project.objects["PBXGroup"][id];
|
||||
return _group.name === group.name;
|
||||
});
|
||||
if (!project.hash.project.objects["PBXVariantGroup"]) {
|
||||
project.hash.project.objects["PBXVariantGroup"] = {};
|
||||
}
|
||||
const variantGroupId = Object.keys(project.hash.project.objects["PBXVariantGroup"]).find((id) => {
|
||||
const _group = project.hash.project.objects["PBXVariantGroup"][id];
|
||||
return _group.name === group.name;
|
||||
});
|
||||
const children = [...(group.children || [])];
|
||||
for (const child of children) {
|
||||
const file = new pbxFile_1.default(path_1.default.join(group.name, child.comment), opt);
|
||||
file.target = opt ? opt.target : undefined;
|
||||
project.removeFromPbxBuildFileSection(file); // PBXBuildFile
|
||||
project.removeFromPbxFileReferenceSection(file); // PBXFileReference
|
||||
if (group) {
|
||||
if (groupId) {
|
||||
project.removeFromPbxGroup(file, groupId); //Group other than Resources (i.e. 'splash')
|
||||
}
|
||||
else if (variantGroupId) {
|
||||
project.removeFromPbxVariantGroup(file, variantGroupId); // PBXVariantGroup
|
||||
}
|
||||
}
|
||||
project.removeFromPbxResourcesBuildPhase(file); // PBXResourcesBuildPhase
|
||||
}
|
||||
// Link new assets
|
||||
await iterateIconsAsync({ icons }, async (key, icon, index) => {
|
||||
for (const scale of scales) {
|
||||
const iconFileName = getIconName(key, size, scale);
|
||||
if (!(group === null || group === void 0 ? void 0 : group.children.some(({ comment }) => comment === iconFileName))) {
|
||||
// Only write the file if it doesn't already exist.
|
||||
config.modResults = config_plugins_1.IOSConfig.XcodeUtils.addResourceFileToGroup({
|
||||
filepath: path_1.default.join(groupPath, iconFileName),
|
||||
groupName: groupPath,
|
||||
project: config.modResults,
|
||||
isBuildFile: true,
|
||||
verbose: true,
|
||||
});
|
||||
}
|
||||
else {
|
||||
console.log("Skipping duplicate: ", iconFileName);
|
||||
}
|
||||
}
|
||||
});
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIconInfoPlist = (config, { icons }) => {
|
||||
return config_plugins_1.withInfoPlist(config, async (config) => {
|
||||
const altIcons = {};
|
||||
await iterateIconsAsync({ icons }, async (key, icon) => {
|
||||
altIcons[key] = {
|
||||
CFBundleIconFiles: [
|
||||
// Must be a file path relative to the source root (not a icon set it seems).
|
||||
// i.e. `Bacon-Icon-60x60` when the image is `ios/somn/appIcons/[email protected]`
|
||||
getIconName(key, size),
|
||||
],
|
||||
UIPrerenderedIcon: !!icon.prerendered,
|
||||
};
|
||||
});
|
||||
function applyToPlist(key) {
|
||||
if (typeof config.modResults[key] !== "object" ||
|
||||
Array.isArray(config.modResults[key]) ||
|
||||
!config.modResults[key]) {
|
||||
config.modResults[key] = {};
|
||||
}
|
||||
// @ts-expect-error
|
||||
config.modResults[key].CFBundleAlternateIcons = altIcons;
|
||||
// @ts-expect-error
|
||||
config.modResults[key].CFBundlePrimaryIcon = {
|
||||
CFBundleIconFiles: ["AppIcon"],
|
||||
};
|
||||
}
|
||||
// Apply for both tablet and phone support
|
||||
applyToPlist("CFBundleIcons");
|
||||
applyToPlist("CFBundleIcons~ipad");
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIconImages = (config, props) => {
|
||||
return config_plugins_1.withDangerousMod(config, [
|
||||
"ios",
|
||||
async (config) => {
|
||||
await createIconsAsync(config, props);
|
||||
return config;
|
||||
},
|
||||
]);
|
||||
};
|
||||
async function createIconsAsync(config, { icons }) {
|
||||
const iosRoot = path_1.default.join(config.modRequest.platformProjectRoot, config.modRequest.projectName);
|
||||
// Delete all existing assets
|
||||
await fs_1.default.promises
|
||||
.rmdir(path_1.default.join(iosRoot, folderName), { recursive: true })
|
||||
.catch(() => null);
|
||||
// Ensure directory exists
|
||||
await fs_1.default.promises.mkdir(path_1.default.join(iosRoot, folderName), { recursive: true });
|
||||
// Generate new assets
|
||||
await iterateIconsAsync({ icons }, async (key, icon) => {
|
||||
for (const scale of scales) {
|
||||
const iconFileName = getIconName(key, size, scale);
|
||||
const fileName = path_1.default.join(folderName, iconFileName);
|
||||
const outputPath = path_1.default.join(iosRoot, fileName);
|
||||
const scaledSize = scale * size;
|
||||
const { source } = await image_utils_1.generateImageAsync({
|
||||
projectRoot: config.modRequest.projectRoot,
|
||||
cacheType: "react-native-dynamic-app-icon",
|
||||
}, {
|
||||
name: iconFileName,
|
||||
src: icon.image,
|
||||
removeTransparency: true,
|
||||
backgroundColor: "#ffffff",
|
||||
resizeMode: "cover",
|
||||
width: scaledSize,
|
||||
height: scaledSize,
|
||||
});
|
||||
await fs_1.default.promises.writeFile(outputPath, source);
|
||||
}
|
||||
});
|
||||
}
|
||||
async function iterateIconsAsync({ icons }, callback) {
|
||||
const entries = Object.entries(icons);
|
||||
for (let i = 0; i < entries.length; i++) {
|
||||
const [key, val] = entries[i];
|
||||
await callback(key, val, i);
|
||||
}
|
||||
}
|
||||
exports.default = withDynamicIcon;
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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 truncated
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-dynamic-app-icon",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin to auto configure react-native-dynamic-app-icon",
|
||||
"main": "build/index.js",
|
||||
"types": "build/index.d.ts",
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
### @config-plugins/react-native-google-cast [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* git ignore build folders ([#59](https://github.com/expo/config-plugins/issues/59)) ([d6050be](https://github.com/expo/config-plugins/commit/d6050beb2a5c68dc59287c27ec388c2002ec7904))
|
||||
|
||||
### @config-plugins/react-native-google-cast [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withAndroidGoogleCast: ConfigPlugin<{
|
||||
/**
|
||||
* @default '+'
|
||||
*/
|
||||
androidPlayServicesCastFrameworkVersion?: string;
|
||||
/**
|
||||
* ??
|
||||
*/
|
||||
receiverAppId?: string;
|
||||
}>;
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.withAndroidGoogleCast = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
const codeMod_1 = require("@expo/config-plugins/build/android/codeMod");
|
||||
const { addMetaDataItemToMainApplication, getMainApplicationOrThrow } = config_plugins_1.AndroidConfig.Manifest;
|
||||
const META_PROVIDER_CLASS = "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME";
|
||||
const META_RECEIVER_APP_ID = "com.reactnative.googlecast.RECEIVER_APPLICATION_ID";
|
||||
const CUSTOM_ACTIVITY = "com.reactnative.googlecast.RNGCExpandedControllerActivity";
|
||||
async function ensureCustomActivityAsync({ mainApplication, }) {
|
||||
if (Array.isArray(mainApplication.activity)) {
|
||||
// Remove all activities matching the custom name
|
||||
mainApplication.activity = mainApplication.activity.filter((activity) => {
|
||||
var _a;
|
||||
return ((_a = activity.$) === null || _a === void 0 ? void 0 : _a["android:name"]) !== CUSTOM_ACTIVITY;
|
||||
});
|
||||
}
|
||||
else {
|
||||
mainApplication.activity = [];
|
||||
}
|
||||
// `<activity android:name="${CUSTOM_ACTIVITY}" />`
|
||||
mainApplication.activity.push({
|
||||
$: {
|
||||
"android:name": CUSTOM_ACTIVITY,
|
||||
},
|
||||
});
|
||||
return mainApplication;
|
||||
}
|
||||
const withAndroidManifestCast = (config, { receiverAppId } = {}) => {
|
||||
return config_plugins_1.withAndroidManifest(config, async (config) => {
|
||||
const mainApplication = getMainApplicationOrThrow(config.modResults);
|
||||
ensureCustomActivityAsync({ mainApplication });
|
||||
addMetaDataItemToMainApplication(mainApplication, META_PROVIDER_CLASS,
|
||||
// This is the native Java class
|
||||
"com.reactnative.googlecast.GoogleCastOptionsProvider");
|
||||
if (receiverAppId) {
|
||||
addMetaDataItemToMainApplication(mainApplication, META_RECEIVER_APP_ID, receiverAppId);
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withProjectBuildGradleVersion = (config, { version }) => {
|
||||
return config_plugins_1.withProjectBuildGradle(config, (config) => {
|
||||
if (config.modResults.language !== "groovy")
|
||||
throw new Error("react-native-google-cast config plugin does not support Kotlin /build.gradle yet.");
|
||||
config.modResults.contents = addGoogleCastVersionImport(config.modResults.contents, {
|
||||
version,
|
||||
}).contents;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withAppBuildGradleImport = (config, { version }) => {
|
||||
return config_plugins_1.withAppBuildGradle(config, (config) => {
|
||||
if (config.modResults.language !== "groovy")
|
||||
throw new Error("react-native-google-cast config plugin does not support Kotlin app/build.gradle yet.");
|
||||
config.modResults.contents = addSafeExtGet(config.modResults.contents);
|
||||
config.modResults.contents = addGoogleCastImport(config.modResults.contents, {
|
||||
version,
|
||||
}).contents;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withMainActivityLazyLoading = (config) => {
|
||||
return config_plugins_1.withMainActivity(config, async (config) => {
|
||||
let src = codeMod_1.addImports(config.modResults.contents, ["com.google.android.gms.cast.framework.CastContext"], config.modResults.language === "java");
|
||||
if (config.modResults.language === "java") {
|
||||
config.modResults.contents = addGoogleCastLazyLoadingImport(src).contents;
|
||||
}
|
||||
else {
|
||||
throw new Error("react-native-google-cast config plugin does not support kotlin MainActivity yet.");
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
// castFrameworkVersion
|
||||
const withAndroidGoogleCast = (config, props) => {
|
||||
var _a, _b;
|
||||
config = withAndroidManifestCast(config, {
|
||||
receiverAppId: props.receiverAppId,
|
||||
});
|
||||
config = withMainActivityLazyLoading(config);
|
||||
config = withProjectBuildGradleVersion(config, {
|
||||
// gradle dep version
|
||||
version: (_a = props.androidPlayServicesCastFrameworkVersion) !== null && _a !== void 0 ? _a : "+",
|
||||
});
|
||||
config = withAppBuildGradleImport(config, {
|
||||
// gradle dep version
|
||||
version: (_b = props.androidPlayServicesCastFrameworkVersion) !== null && _b !== void 0 ? _b : "+",
|
||||
});
|
||||
return config;
|
||||
};
|
||||
exports.withAndroidGoogleCast = withAndroidGoogleCast;
|
||||
function addGoogleCastLazyLoadingImport(src) {
|
||||
const newSrc = [];
|
||||
newSrc.push(" CastContext.getSharedInstance(this);");
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-onCreate",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /super\.onCreate\(\w+\);/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
// TODO: Add this ability to autolinking
|
||||
// dependencies { implementation "com.google.android.gms:play-services-cast-framework:+" }
|
||||
function addGoogleCastImport(src, { version } = {}) {
|
||||
const newSrc = [];
|
||||
newSrc.push(` implementation "com.google.android.gms:play-services-cast-framework:\${safeExtGet('castFrameworkVersion', '${version}')}"`);
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-dependencies",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /dependencies(?:\s+)?\{/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
function addSafeExtGet(src) {
|
||||
const tag = "safeExtGet";
|
||||
src = generateCode_1.removeContents({ src, tag }).contents;
|
||||
// If the source already has a safeExtGet method after removing this one, then go with the existing one.
|
||||
if (src.match(/def(?:\s+)?safeExtGet\(/)) {
|
||||
return src;
|
||||
}
|
||||
// Otherwise add a new one
|
||||
const newSrc = [];
|
||||
newSrc.push("def safeExtGet(prop, fallback) {", " rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback", "}");
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "safeExtGet",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
// This block can go anywhere in the upper scope
|
||||
anchor: /apply plugin/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
}).contents;
|
||||
}
|
||||
function addGoogleCastVersionImport(src, { version } = {}) {
|
||||
const newSrc = [];
|
||||
newSrc.push(` castFrameworkVersion = "${version}"`);
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-version",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /ext(?:\s+)?\{/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
declare const _default: ConfigPlugin<void | {
|
||||
/**
|
||||
* @default '+'
|
||||
*/
|
||||
androidPlayServicesCastFrameworkVersion?: string | undefined;
|
||||
/**
|
||||
* @default 'CC1AD845'
|
||||
*/
|
||||
iosReceiverAppId?: string | undefined;
|
||||
/**
|
||||
* ??
|
||||
*/
|
||||
androidReceiverAppId?: string | undefined;
|
||||
}>;
|
||||
export default _default;
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const withAndroidGoogleCast_1 = require("./withAndroidGoogleCast");
|
||||
const withIosGoogleCast_1 = require("./withIosGoogleCast");
|
||||
const withGoogleCast = (config, _props) => {
|
||||
const props = _props || {};
|
||||
// TODO: Are the Android and iOS receiverAppId values the same?
|
||||
config = withIosGoogleCast_1.withIosGoogleCast(config, {
|
||||
receiverAppId: props.iosReceiverAppId,
|
||||
// disableDiscoveryAutostart?: boolean;
|
||||
// startDiscoveryAfterFirstTapOnCastButton?: boolean;
|
||||
});
|
||||
config = withAndroidGoogleCast_1.withAndroidGoogleCast(config, {
|
||||
receiverAppId: props.androidReceiverAppId,
|
||||
androidPlayServicesCastFrameworkVersion: props.androidPlayServicesCastFrameworkVersion,
|
||||
});
|
||||
return config;
|
||||
};
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withGoogleCast, "react-native-google-cast");
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withIosGoogleCast: ConfigPlugin<{
|
||||
/**
|
||||
* @default 'CC1AD845'
|
||||
*/
|
||||
receiverAppId?: string;
|
||||
}>;
|
||||
export declare const MATCH_INIT: RegExp;
|
||||
declare type IosProps = {
|
||||
receiverAppId?: string | null;
|
||||
disableDiscoveryAutostart?: boolean;
|
||||
startDiscoveryAfterFirstTapOnCastButton?: boolean;
|
||||
};
|
||||
export declare function addGoogleCastAppDelegateDidFinishLaunchingWithOptions(src: string, { receiverAppId, disableDiscoveryAutostart, startDiscoveryAfterFirstTapOnCastButton, }?: IosProps): import("@expo/config-plugins/build/utils/generateCode").MergeResults;
|
||||
export {};
|
||||
+124
@@ -0,0 +1,124 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addGoogleCastAppDelegateDidFinishLaunchingWithOptions = exports.MATCH_INIT = exports.withIosGoogleCast = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
/**
|
||||
* In Xcode, go to Signing & Capabilities, click + Capability and select Access WiFi Information. (This is required since iOS 12.)
|
||||
* Note that "Wireless Accessory Configuration" is unrelated.
|
||||
*
|
||||
* @param {*} config
|
||||
* @returns
|
||||
*/
|
||||
const withIosWifiEntitlements = (config) => {
|
||||
return config_plugins_1.withEntitlementsPlist(config, (config) => {
|
||||
config.modResults["com.apple.developer.networking.wifi-info"] = true;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const LOCAL_NETWORK_USAGE = "${PRODUCT_NAME} uses the local network to discover Cast-enabled devices on your WiFi network";
|
||||
const BLUETOOTH_ALWAYS_USAGE = "${PRODUCT_NAME} uses Bluetooth to discover nearby Cast devices";
|
||||
const BLUETOOTH_PERIPHERAL_USAGE = "${PRODUCT_NAME} uses Bluetooth to discover nearby Cast devices";
|
||||
const MICROPHONE_USAGE = "${PRODUCT_NAME} uses microphone access to listen for ultrasonic tokens when pairing with nearby Cast devices";
|
||||
/**
|
||||
* On iOS, a dialog asking the user for the local network permission will now be displayed immediately when the app is opened.
|
||||
*
|
||||
* @param {*} config
|
||||
* @param {*} props.receiverAppId If using a custom receiver, make sure to replace `CC1AD845` with your custom receiver app id.
|
||||
* @returns
|
||||
*/
|
||||
const withIosLocalNetworkPermissions = (config, { receiverAppId = "CC1AD845" } = {}) => {
|
||||
return config_plugins_1.withInfoPlist(config, (config) => {
|
||||
if (!Array.isArray(config.modResults.NSBonjourServices)) {
|
||||
config.modResults.NSBonjourServices = [];
|
||||
}
|
||||
// Add required values
|
||||
config.modResults.NSBonjourServices.push("_googlecast._tcp", `_${receiverAppId}._googlecast._tcp`);
|
||||
// Remove duplicates
|
||||
config.modResults.NSBonjourServices = [
|
||||
...new Set(config.modResults.NSBonjourServices),
|
||||
];
|
||||
// For iOS 14+, you need to add local network permissions to Info.plist:
|
||||
// https://developers.google.com/cast/docs/ios_sender/ios_permissions_changes#updating_your_app_on_ios_14
|
||||
config.modResults.NSLocalNetworkUsageDescription =
|
||||
config.modResults.NSLocalNetworkUsageDescription || LOCAL_NETWORK_USAGE;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIosGuestMode = (config) => {
|
||||
return config_plugins_1.withInfoPlist(config, (config) => {
|
||||
config.modResults.NSBluetoothAlwaysUsageDescription =
|
||||
config.modResults.NSBluetoothAlwaysUsageDescription ||
|
||||
BLUETOOTH_ALWAYS_USAGE;
|
||||
config.modResults.NSBluetoothPeripheralUsageDescription =
|
||||
config.modResults.NSBluetoothPeripheralUsageDescription ||
|
||||
BLUETOOTH_PERIPHERAL_USAGE;
|
||||
config.modResults.NSMicrophoneUsageDescription =
|
||||
config.modResults.NSMicrophoneUsageDescription || MICROPHONE_USAGE;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
// TODO: Use AppDelegate swizzling
|
||||
const withIosAppDelegateLoaded = (config, props) => {
|
||||
return config_plugins_1.withAppDelegate(config, (config) => {
|
||||
if (config.modResults.language !== "objc") {
|
||||
throw new Error("react-native-google-cast config plugin does not support Swift AppDelegate yet.");
|
||||
}
|
||||
config.modResults.contents =
|
||||
addGoogleCastAppDelegateDidFinishLaunchingWithOptions(config.modResults.contents, props).contents;
|
||||
config.modResults.contents = addGoogleCastAppDelegateImport(config.modResults.contents).contents;
|
||||
return config;
|
||||
});
|
||||
};
|
||||
const withIosGoogleCast = (config, props) => {
|
||||
config = withIosWifiEntitlements(config);
|
||||
config = withIosLocalNetworkPermissions(config, {
|
||||
receiverAppId: props.receiverAppId,
|
||||
});
|
||||
config = withIosAppDelegateLoaded(config, {
|
||||
receiverAppId: props.receiverAppId,
|
||||
// disableDiscoveryAutostart?: boolean;
|
||||
// startDiscoveryAfterFirstTapOnCastButton?: boolean;
|
||||
});
|
||||
// TODO
|
||||
// config = withIosGuestMode(config)
|
||||
return config;
|
||||
};
|
||||
exports.withIosGoogleCast = withIosGoogleCast;
|
||||
// From expo-cli RNMaps setup
|
||||
exports.MATCH_INIT = /(?:(self\.|_)(\w+)\s?=\s?\[\[UMModuleRegistryAdapter alloc\])|(?:RCTBridge\s?\*\s?(\w+)\s?=\s?\[\[RCTBridge alloc\])|(\[self\.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions\])/g;
|
||||
function addGoogleCastAppDelegateDidFinishLaunchingWithOptions(src, { receiverAppId = null, disableDiscoveryAutostart = false, startDiscoveryAfterFirstTapOnCastButton = true, } = {}) {
|
||||
let newSrc = [];
|
||||
newSrc.push(
|
||||
// For extra safety
|
||||
"#if __has_include(<GoogleCast/GoogleCast.h>)",
|
||||
// TODO: This should probably read safely from a static file like the Info.plist
|
||||
` NSString *receiverAppID = ${receiverAppId
|
||||
? `@"${receiverAppId}"`
|
||||
: "kGCKDefaultMediaReceiverApplicationID"};`, " GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc] initWithApplicationID:receiverAppID];", " GCKCastOptions* options = [[GCKCastOptions alloc] initWithDiscoveryCriteria:criteria];",
|
||||
// TODO: Same as above, read statically
|
||||
// ` options.disableDiscoveryAutostart = ${String(!!disableDiscoveryAutostart)};`,
|
||||
` options.startDiscoveryAfterFirstTapOnCastButton = ${String(!!startDiscoveryAfterFirstTapOnCastButton)};`, " [GCKCastContext setSharedInstanceWithOptions:options];", "#endif");
|
||||
newSrc = newSrc.filter(Boolean);
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-didFinishLaunchingWithOptions",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: exports.MATCH_INIT,
|
||||
offset: 0,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
exports.addGoogleCastAppDelegateDidFinishLaunchingWithOptions = addGoogleCastAppDelegateDidFinishLaunchingWithOptions;
|
||||
function addGoogleCastAppDelegateImport(src) {
|
||||
const newSrc = [];
|
||||
newSrc.push("#if __has_include(<GoogleCast/GoogleCast.h>)", "#import <GoogleCast/GoogleCast.h>", "#endif");
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-google-cast-import",
|
||||
src,
|
||||
newSrc: newSrc.join("\n"),
|
||||
anchor: /#import "AppDelegate\.h"/,
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-google-cast",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin to auto configure Google Cast on prebuild",
|
||||
"main": "build/withGoogleCast.js",
|
||||
"types": "build/withGoogleCast.d.ts",
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
### @config-plugins/react-native-pdf [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)
|
||||
|
||||
|
||||
### Other chores
|
||||
|
||||
* git ignore build folders ([#59](https://github.com/expo/config-plugins/issues/59)) ([d6050be](https://github.com/expo/config-plugins/commit/d6050beb2a5c68dc59287c27ec388c2002ec7904))
|
||||
|
||||
### @config-plugins/react-native-pdf [1.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-16)
|
||||
|
||||
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
import { ConfigPlugin } from "@expo/config-plugins";
|
||||
export declare const withAndroidPackagingOptions: ConfigPlugin;
|
||||
export declare function addAndroidPackagingOptions(src: string): import("@expo/config-plugins/build/utils/generateCode").MergeResults;
|
||||
declare const _default: ConfigPlugin<void>;
|
||||
export default _default;
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.addAndroidPackagingOptions = exports.withAndroidPackagingOptions = void 0;
|
||||
const config_plugins_1 = require("@expo/config-plugins");
|
||||
const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
|
||||
let pkg = {
|
||||
name: "react-native-pdf",
|
||||
};
|
||||
try {
|
||||
pkg = require("react-native-pdf/package.json");
|
||||
}
|
||||
catch (_a) {
|
||||
// empty catch block
|
||||
}
|
||||
const withAndroidPackagingOptions = (config) => {
|
||||
return config_plugins_1.withAppBuildGradle(config, (config) => {
|
||||
if (config.modResults.language === "groovy") {
|
||||
config.modResults.contents = addAndroidPackagingOptions(config.modResults.contents).contents;
|
||||
}
|
||||
else {
|
||||
config_plugins_1.WarningAggregator.addWarningAndroid("@config-plugins/react-native-pdf", `Cannot automatically configure app build.gradle if it's not groovy`);
|
||||
}
|
||||
return config;
|
||||
});
|
||||
};
|
||||
exports.withAndroidPackagingOptions = withAndroidPackagingOptions;
|
||||
function addAndroidPackagingOptions(src) {
|
||||
return generateCode_1.mergeContents({
|
||||
tag: "react-native-pdf-packaging-options",
|
||||
src,
|
||||
newSrc: packagingOptionsContents,
|
||||
anchor: /android(?:\s+)?\{/,
|
||||
// Inside the android block.
|
||||
offset: 1,
|
||||
comment: "//",
|
||||
});
|
||||
}
|
||||
exports.addAndroidPackagingOptions = addAndroidPackagingOptions;
|
||||
const packagingOptionsContents = `
|
||||
packagingOptions {
|
||||
pickFirst 'lib/x86/libc++_shared.so'
|
||||
pickFirst 'lib/x86_64/libjsc.so'
|
||||
pickFirst 'lib/arm64-v8a/libjsc.so'
|
||||
pickFirst 'lib/arm64-v8a/libc++_shared.so'
|
||||
pickFirst 'lib/x86_64/libc++_shared.so'
|
||||
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
|
||||
}
|
||||
`;
|
||||
const withReactNativePdf = (config) => {
|
||||
return exports.withAndroidPackagingOptions(config);
|
||||
};
|
||||
exports.default = config_plugins_1.createRunOncePlugin(withReactNativePdf, pkg.name, pkg.version);
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@config-plugins/react-native-pdf",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"description": "Config plugin to auto configure react-native-pdf on prebuild",
|
||||
"main": "build/withPdf.js",
|
||||
"types": "build/withPdf.d.ts",
|
||||
|
||||
Reference in new issue
Block a user