Skip to content

Commit

Permalink
update android schema
Browse files Browse the repository at this point in the history
  • Loading branch information
pavjacko committed Oct 14, 2023
1 parent ae72f8a commit 1c3202d
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 108 deletions.
105 changes: 49 additions & 56 deletions packages/core/src/schema/zod/android/configPlatformAndroid.ts
Original file line number Diff line number Diff line change
@@ -1,67 +1,60 @@
import { z } from 'zod';
import { PlatformSharedAndroid } from './configPlatformSharedAndroid';
import { PlatformSharedAndroid, TemplateAndroidShared } from './configPlatformSharedAndroid';

const EnableAndroidX = z.boolean().default(true).describe('Enables new android X architecture');

export const PlatformAndroid = PlatformSharedAndroid.merge(
z.object({
enableAndroidX: z.optional(EnableAndroidX),
signingConfig: z.optional(
z
.string()
.default('Debug')
.describe('Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`')
),
reactNativeEngine: z.optional(
z
.enum(['v8-android', 'v8-android-nointl', 'v8-android-jit', 'v8-android-jit-nointl', 'hermes'])
.default('hermes')
.describe('Allows you to define specific native render engine to be used')
),
minSdkVersion: z.optional(
z.number().default(28).describe('Minimum Android SDK version device has to have in order for app to run')
),
multipleAPKs: z.optional(
z
.boolean()
.describe(
'If set to `true`, apk will be split into multiple ones for each architecture: "armeabi-v7a", "x86", "arm64-v8a", "x86_64"'
)
),
templateAndroid: z.optional(
TemplateAndroidShared.merge(
z.object({
settings_gradle: z.object({}),
gradle_wrapper_properties: z.object({}),
MainActivity_java: z.object({}),
MainApplication_java: z
.object({
onCreate: z.object({
// onCreate: {
// type: 'string',
// description: 'Overrides super.onCreate method handler of MainActivity.kt',
// default: 'super.onCreate(savedInstanceState)',
// examples: ['super.onCreate(null)', 'super.onCreate(savedInstanceState)'],
// },
}),
})
.describe('Allows you to configure behaviour of MainActivity'),
SplashActivity_java: z.object({}),
styles_xml: z.object({}),
colors_xml: z.object({}),
strings_xml: z.object({}),
proguard_rules_pro: z.object({}),
})
)
),

projectTemplate: z.object({
settings_gradle: z.object({}),
gradle_wrapper_properties: z.object({}),
MainActivity_java: z.object({}),
MainApplication_java: z.object({}),
SplashActivity_java: z.object({}),
styles_xml: z.object({}),
colors_xml: z.object({}),
strings_xml: z.object({}),
proguard_rules_pro: z.object({}),
// mainActivity: {
// type: 'object',
// description: 'Allows you to configure behaviour of MainActivity.kt',
// default: '{}',
// properties: {
// onCreate: {
// type: 'string',
// description: 'Overrides super.onCreate method handler of MainActivity.kt',
// default: 'super.onCreate(savedInstanceState)',
// examples: ['super.onCreate(null)', 'super.onCreate(savedInstanceState)'],
// },
// },
// },
}),

// enableHermes: {
// type: 'boolean',
// default: false,
// description: '> DEPRECATED in favour of `reactNativeEngine`',
// examples: [true, false],
// },
// reactNativeEngine: {
// type: 'string',
// default: 'default',
// description: 'Allows you to define specific native render engine to be used',
// examples: [true, false],
// },
// signingConfig: {
// type: 'string',
// default: 'Debug',
// description: 'Equivalent to running `./gradlew/assembleDebug` or `./gradlew/assembleRelease`',
// examples: ['default', 'v8-android', 'v8-android-nointl', 'v8-android-jit', 'v8-android-jit-nointl', 'hermes'],
// },
// minSdkVersion: {
// type: 'integer',
// default: 21,
// examples: [21, 22],
// },
// multipleAPKs: {
// type: 'boolean',
// default: false,
// description:
// 'If set to `true`, apk will be split into multiple ones for each architecture: "armeabi-v7a", "x86", "arm64-v8a", "x86_64"',
// examples: [true, false],
// },
// aab: {
// type: 'boolean',
// description: 'If set to true, android project will generate app.aab instead of apk',
Expand Down
41 changes: 22 additions & 19 deletions packages/core/src/schema/zod/android/configPlatformSharedAndroid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const AppBuildGradle = z
})
),
afterEvaluate: z.optional(z.array(z.string())),
implementations: z.optional(z.array(z.string())),
})
.describe('Overrides values in `app/build.gradle` file of generated android based project');

Expand Down Expand Up @@ -62,26 +63,28 @@ Injects / Overrides values in AndroidManifest.xml file of generated android base

// });

export const TemplateAndroidShared = z.object({
gradle_properties: z.optional(GradleProperties),
build_gradle: z.optional(BuildGradle),
app_build_gradle: z.optional(AppBuildGradle),
AndroidManifest_xml: z.optional(AndroidManifest),
strings_xml: z.optional(
z.object({
children: z.optional(
z.array(
z.object({
tag: z.string(),
name: z.string(),
child_value: z.string(),
})
)
),
})
),
});

export const PlatformSharedAndroid = z.object({
nativeAndroidTemplate: z.object({
gradle_properties: z.optional(GradleProperties),
build_gradle: z.optional(BuildGradle),
app_build_gradle: z.optional(AppBuildGradle),
AndroidManifest_xml: z.optional(AndroidManifest),
strings_xml: z.optional(
z.object({
children: z.optional(
z.array(
z.object({
tag: z.string(),
name: z.string(),
child_value: z.string(),
})
)
),
})
),
}),
templateAndroid: z.optional(TemplateAndroidShared),

// applyPlugin: {
// type: 'array',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { z } from 'zod';

export const PlatformElectron = z.object({
electronTemplate: z.object({}),
electronTemplate: z.optional(z.object({})),
// electronConfig: {
// additionalProperties: true,
// type: 'object',
Expand Down
55 changes: 25 additions & 30 deletions packages/sdk-android/src/gradleParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import {
writeCleanFile,
} from '@rnv/core';
import path from 'path';
import { Context } from './types';
import { Context, TemplateAndroid } from './types';

export const parseBuildGradleSync = (c: Context) => {
const appFolder = getAppFolder(c);
Expand Down Expand Up @@ -328,8 +328,9 @@ ${chalk().white(c.paths.workspace?.appConfig?.configsPrivate?.join('\n'))}`);

// BUILD_TYPES
const pluginConfig = c.buildConfig ?? {};
const debugBuildTypes = pluginConfig?.platforms?.[platform]?.gradle?.buildTypes?.debug ?? [];
const releaseBuildTypes: string[] = pluginConfig?.platforms?.[platform]?.gradle?.buildTypes?.release ?? [];
const appBuildGradle = pluginConfig?.platforms?.[platform]?.templateAndroid?.app_build_gradle;
const debugBuildTypes = appBuildGradle?.buildTypes?.debug ?? [];
const releaseBuildTypes: string[] = appBuildGradle?.buildTypes?.release ?? [];
const isSigningDisabled = getConfigProp(c, platform, 'disableSigning') === true;
c.payload.pluginConfigAndroid.buildTypes = `
debug {
Expand Down Expand Up @@ -550,7 +551,7 @@ export const parseGradlePropertiesSync = (c: Context) => {
let pluginGradleProperties = '';
const pluginConfigAndroid: RenativeConfigPlatform = c.buildConfig?.platforms?.[platform] || {};

const gradleProps = pluginConfigAndroid['gradle.properties'];
const gradleProps = pluginConfigAndroid.templateAndroid?.gradle_properties;

if (gradleProps) {
const enableAndroidX = getConfigProp(c, platform, 'enableAndroidX', true);
Expand Down Expand Up @@ -657,27 +658,11 @@ export const injectPluginGradleSync = (
}
};

const getObj = <T = any>(c: RnvContext, obj: any, keys: Array<string>): T | undefined => {
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const val = obj ? obj[key] : getConfigProp(c, c.platform, key);
if (val) return val;
}
};

export const parseAndroidConfigObject = (c: RnvContext, obj?: any, key = '') => {
const implementations = getObj<string[]>(c, obj, ['implementations']);
if (implementations) {
implementations.forEach((v) => {
c.payload.pluginConfigAndroid.appBuildGradleImplementations += ` implementation ${sanitizePluginPath(
v,
key
)}\n`;
});
}

// APP/BUILD.GRADLE
const appBuildGradle = getObj<RenativeConfigPluginPlatform['app/build.gradle']>(c, obj, ['app/build.gradle']);
const templateAndroid = getConfigProp<TemplateAndroid>(c, obj, 'templateAndroid');

const appBuildGradle = templateAndroid.app_build_gradle;
if (appBuildGradle) {
if (appBuildGradle.apply) {
appBuildGradle.apply.forEach((v) => {
Expand All @@ -690,17 +675,27 @@ export const parseAndroidConfigObject = (c: RnvContext, obj?: any, key = '') =>
c.payload.pluginConfigAndroid.defaultConfig += `${sanitizePluginPath(v, key)}\n`;
});
}
}

const afterEvaluate = getObj<RenativeConfigPluginPlatform['afterEvaluate']>(c, obj, ['afterEvaluate']);
if (afterEvaluate) {
afterEvaluate.forEach((v) => {
c.payload.pluginConfigAndroid.appBuildGradleAfterEvaluate += ` ${sanitizePluginPath(v, key)}\n`;
});
const { implementations } = appBuildGradle;
if (implementations) {
implementations.forEach((v) => {
c.payload.pluginConfigAndroid.appBuildGradleImplementations += ` implementation ${sanitizePluginPath(
v,
key
)}\n`;
});
}

const afterEvaluate = appBuildGradle?.afterEvaluate;
if (afterEvaluate) {
afterEvaluate.forEach((v) => {
c.payload.pluginConfigAndroid.appBuildGradleAfterEvaluate += ` ${sanitizePluginPath(v, key)}\n`;
});
}
}

// BUILD.GRADLE
const buildGradle = getObj<RenativeConfigPluginPlatform['build.gradle']>(c, obj, ['BuildGradle', 'build.gradle']);
const buildGradle = templateAndroid.build_gradle;

const allProjRepos = buildGradle?.allprojects?.repositories;
if (allProjRepos) {
Expand Down
4 changes: 3 additions & 1 deletion packages/sdk-android/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export type Payload = {
pluginActivityResultMethods: string;
pluginApplicationCreateMethods: string;
pluginSplashActivityImports: string;
resourceStrings: Required<Required<RenativeConfigPluginPlatform>['ResourceStrings']>['children'];
resourceStrings: Required<TemplateAndroid['strings_xml']>['children'];
store?: {
storeFile: string;
keyAlias: string;
Expand Down Expand Up @@ -74,3 +74,5 @@ export type AndroidDevice = {
isActive: boolean;
isRunning?: boolean;
};

export type TemplateAndroid = Required<Required<RenativeConfigPluginPlatform>['templateAndroid']>;
2 changes: 1 addition & 1 deletion packages/sdk-android/src/xmlValuesParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export const parseValuesColorsSync = (c: Context) => {
};

export const injectPluginXmlValuesSync = (c: Context, plugin: RenativeConfigPluginPlatform) => {
const rStrings = plugin.ResourceStrings?.children;
const rStrings = plugin.templateAndroid?.strings_xml?.children;
if (rStrings) {
rStrings.forEach((obj) => {
c.payload.pluginConfigAndroid.resourceStrings.push(obj);
Expand Down
32 changes: 32 additions & 0 deletions spec/spec.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@



.xml
.gradle
.properties
.java
.mm



templateWeb

templateAndroid

templateXcode

templateTizenWeb

templateTizenNative

templateWebos

templateNext

templateElectron

templateRoku

templateLightning

templateVisualStudio

0 comments on commit 1c3202d

Please sign in to comment.