1import { ExpoConfig } from '@expo/config-types'; 2 3import { AndroidManifest, getMainActivityOrThrow } from './Manifest'; 4import { ConfigPlugin } from '../Plugin.types'; 5import { withAndroidManifest } from '../plugins/android-plugins'; 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