1import { ExpoConfig } from '@expo/config-types';
2
3import { ConfigPlugin } from '../Plugin.types';
4import { withAndroidManifest } from '../plugins/android-plugins';
5import { AndroidManifest, getMainActivityOrThrow } from './Manifest';
6
7const ANDROID_WINDOW_SOFT_INPUT_MODE = 'android:windowSoftInputMode';
8
9const MAPPING: Record<string, string> = {
10  pan: 'adjustPan',
11  resize: 'adjustResize',
12};
13
14export const withWindowSoftInputMode: ConfigPlugin = (config) => {
15  return withAndroidManifest(config, async (config) => {
16    config.modResults = setWindowSoftInputModeMode(config, config.modResults);
17    return config;
18  });
19};
20
21export function setWindowSoftInputModeMode(
22  config: Pick<ExpoConfig, 'android' | 'userInterfaceStyle'>,
23  androidManifest: AndroidManifest
24) {
25  const app = getMainActivityOrThrow(androidManifest);
26  app.$[ANDROID_WINDOW_SOFT_INPUT_MODE] = getWindowSoftInputModeMode(config);
27  return androidManifest;
28}
29
30export function getWindowSoftInputModeMode(config: Pick<ExpoConfig, 'android'>) {
31  const value = config.android?.softwareKeyboardLayoutMode;
32
33  if (!value) {
34    // Default to `adjustResize` or `resize`.
35    return 'adjustResize';
36  }
37  return MAPPING[value] ?? value;
38}
39