1082815dcSEvan Baconimport { ExpoConfig } from '@expo/config-types';
2082815dcSEvan Bacon
3*8a424bebSJames Ideimport { AndroidManifest, getMainActivityOrThrow } from './Manifest';
4082815dcSEvan Baconimport { ConfigPlugin } from '../Plugin.types';
5082815dcSEvan Baconimport { withAndroidManifest } from '../plugins/android-plugins';
6082815dcSEvan Bacon
7082815dcSEvan Baconconst ANDROID_WINDOW_SOFT_INPUT_MODE = 'android:windowSoftInputMode';
8082815dcSEvan Bacon
9082815dcSEvan Baconconst MAPPING: Record<string, string> = {
10082815dcSEvan Bacon  pan: 'adjustPan',
11082815dcSEvan Bacon  resize: 'adjustResize',
12082815dcSEvan Bacon};
13082815dcSEvan Bacon
14082815dcSEvan Baconexport const withWindowSoftInputMode: ConfigPlugin = (config) => {
15082815dcSEvan Bacon  return withAndroidManifest(config, async (config) => {
16082815dcSEvan Bacon    config.modResults = setWindowSoftInputModeMode(config, config.modResults);
17082815dcSEvan Bacon    return config;
18082815dcSEvan Bacon  });
19082815dcSEvan Bacon};
20082815dcSEvan Bacon
21082815dcSEvan Baconexport function setWindowSoftInputModeMode(
22082815dcSEvan Bacon  config: Pick<ExpoConfig, 'android' | 'userInterfaceStyle'>,
23082815dcSEvan Bacon  androidManifest: AndroidManifest
24082815dcSEvan Bacon) {
25082815dcSEvan Bacon  const app = getMainActivityOrThrow(androidManifest);
26082815dcSEvan Bacon  app.$[ANDROID_WINDOW_SOFT_INPUT_MODE] = getWindowSoftInputModeMode(config);
27082815dcSEvan Bacon  return androidManifest;
28082815dcSEvan Bacon}
29082815dcSEvan Bacon
30082815dcSEvan Baconexport function getWindowSoftInputModeMode(config: Pick<ExpoConfig, 'android'>) {
31082815dcSEvan Bacon  const value = config.android?.softwareKeyboardLayoutMode;
32082815dcSEvan Bacon
33082815dcSEvan Bacon  if (!value) {
34082815dcSEvan Bacon    // Default to `adjustResize` or `resize`.
35082815dcSEvan Bacon    return 'adjustResize';
36082815dcSEvan Bacon  }
37082815dcSEvan Bacon  return MAPPING[value] ?? value;
38082815dcSEvan Bacon}
39