129 lines
5.0 KiB
JavaScript
129 lines
5.0 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.withWebBrowserAndroid = void 0;
|
|
const config_plugins_1 = require("expo/config-plugins");
|
|
const fs_1 = __importDefault(require("fs"));
|
|
const path_1 = __importDefault(require("path"));
|
|
const utils_1 = require("./utils");
|
|
const withWebBrowserAndroid = (config) => {
|
|
config = addActivityToManifest(config);
|
|
config = modifyMainApplication(config);
|
|
config = addLauncherClassToProject(config);
|
|
return config;
|
|
};
|
|
exports.withWebBrowserAndroid = withWebBrowserAndroid;
|
|
function addActivityToManifest(config) {
|
|
return (0, config_plugins_1.withAndroidManifest)(config, (config) => {
|
|
const manifest = config.modResults.manifest;
|
|
const application = manifest?.application?.[0];
|
|
for (const activity of application?.activity ?? []) {
|
|
if (activity.$['android:name'] === '.BrowserLauncherActivity') {
|
|
return config;
|
|
}
|
|
}
|
|
const theme = application?.activity?.[0]?.$['android:theme'];
|
|
application?.activity?.[0]['intent-filter']?.splice(0, 1);
|
|
const launcherActivity = {
|
|
$: {
|
|
'android:name': '.BrowserLauncherActivity',
|
|
'android:theme': theme,
|
|
'android:exported': 'true',
|
|
},
|
|
'intent-filter': [
|
|
{
|
|
action: [{ $: { 'android:name': 'android.intent.action.MAIN' } }],
|
|
category: [{ $: { 'android:name': 'android.intent.category.LAUNCHER' } }],
|
|
},
|
|
],
|
|
};
|
|
application?.activity?.push(launcherActivity);
|
|
return config;
|
|
});
|
|
}
|
|
function addLauncherClassToProject(config) {
|
|
return (0, config_plugins_1.withDangerousMod)(config, [
|
|
'android',
|
|
async (config) => {
|
|
const fileName = 'BrowserLauncherActivity.kt';
|
|
const dir = path_1.default.dirname(config_plugins_1.AndroidConfig.Paths.getProjectFilePath(config.modRequest.projectRoot, 'MainApplication'));
|
|
const fullPath = path_1.default.join(dir, fileName);
|
|
if (fs_1.default.existsSync(fullPath)) {
|
|
return config;
|
|
}
|
|
const classTemplate = `package ${config.android?.package || ''};
|
|
|
|
import android.app.Activity
|
|
import android.content.Intent
|
|
import android.os.Bundle
|
|
|
|
class BrowserLauncherActivity : Activity() {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
val application = application as MainApplication
|
|
if (!application.isActivityInBackStack(MainActivity::class.java)) {
|
|
val intent = Intent(this, MainActivity::class.java)
|
|
startActivity(intent)
|
|
}
|
|
finish()
|
|
}
|
|
}
|
|
`;
|
|
await fs_1.default.promises.writeFile(fullPath, classTemplate);
|
|
return config;
|
|
},
|
|
]);
|
|
}
|
|
function modifyMainApplication(config) {
|
|
return (0, config_plugins_1.withMainApplication)(config, (config) => {
|
|
const mainApplication = config.modResults;
|
|
const importsMod = (0, utils_1.addImports)(mainApplication.contents, ['android.app.Activity', 'android.os.Bundle'], false);
|
|
let contents = importsMod;
|
|
if (!mainApplication.contents.includes('registerActivityLifecycleCallbacks(lifecycleCallbacks)')) {
|
|
contents = (0, utils_1.appendContentsInsideDeclarationBlock)(importsMod, 'onCreate', 'registerActivityLifecycleCallbacks(lifecycleCallbacks)');
|
|
}
|
|
const result = addMainApplicationMod(contents);
|
|
return {
|
|
...config,
|
|
modResults: {
|
|
...config.modResults,
|
|
contents: result,
|
|
},
|
|
};
|
|
});
|
|
}
|
|
function addMainApplicationMod(contents) {
|
|
if (contents.includes('private val runningActivities = ArrayList<Class<*>>()')) {
|
|
return contents;
|
|
}
|
|
const codeMod = `
|
|
private val runningActivities = ArrayList<Class<*>>()
|
|
|
|
private val lifecycleCallbacks = object : ActivityLifecycleCallbacks {
|
|
override fun onActivityCreated(activity: Activity, p1: Bundle?) {
|
|
if (!runningActivities.contains(activity::class.java)) runningActivities.add(activity::class.java)
|
|
}
|
|
|
|
override fun onActivityStarted(p0: Activity) = Unit
|
|
override fun onActivityResumed(p0: Activity) = Unit
|
|
override fun onActivityPaused(p0: Activity) = Unit
|
|
override fun onActivityStopped(p0: Activity) = Unit
|
|
override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) = Unit
|
|
|
|
override fun onActivityDestroyed(activity: Activity) {
|
|
if (runningActivities.contains(activity::class.java)) runningActivities.remove(activity::class.java)
|
|
}
|
|
}
|
|
|
|
fun isActivityInBackStack(cls: Class<*>?) = runningActivities.contains(cls)
|
|
|
|
override fun onTerminate() {
|
|
super.onTerminate()
|
|
unregisterActivityLifecycleCallbacks(lifecycleCallbacks)
|
|
}
|
|
`;
|
|
return (0, utils_1.appendContentsInsideDeclarationBlock)(contents, 'class MainApplication', codeMod);
|
|
}
|