No meu caso, eu queria ter algo assim:

Tive que seguir a mesma coisa sugerida por @Mdlc, mas provavelmente um pouco mais simples (segmentação apenas > = 21):
//kotlin
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val realSize = Point()
windowManager.defaultDisplay.getRealSize(realSize);
val usableRect = Rect()
windowManager.defaultDisplay.getRectSize(usableRect)
Toast.makeText(this, "Usable Screen: " + usableRect + " real:"+realSize, Toast.LENGTH_LONG).show()
window.decorView.setPadding(usableRect.left, usableRect.top, realSize.x - usableRect.right, realSize.y - usableRect.bottom)
Funciona também na paisagem:

Editar
A solução acima não funciona corretamente no modo de janela múltipla, onde o retângulo utilizável não é menor apenas devido à barra de navegação, mas também devido ao tamanho personalizado da janela. Uma coisa que percebi é que em janelas múltiplas, a barra de navegação não fica pairando sobre o aplicativo, então, mesmo sem alterações no preenchimento de DecorView, temos o comportamento correto:

Observe a diferença entre como a barra de navegação está pairando sobre a parte inferior do aplicativo nesses cenários. Felizmente, isso é fácil de corrigir. Podemos verificar se o aplicativo é multi-janela. O código abaixo também inclui a parte para calcular e ajustar a posição da barra de ferramentas (solução completa: https://stackoverflow.com/a/14213035/477790 )
// kotlin
// Let the window flow into where window decorations are
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
// calculate where the bottom of the page should end up, considering the navigation bar (back buttons, ...)
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val realSize = Point()
windowManager.defaultDisplay.getRealSize(realSize);
val usableRect = Rect()
windowManager.defaultDisplay.getRectSize(usableRect)
Toast.makeText(this, "Usable Screen: " + usableRect + " real:" + realSize, Toast.LENGTH_LONG).show()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N || !isInMultiWindowMode) {
window.decorView.setPadding(usableRect.left, usableRect.top, realSize.x - usableRect.right, realSize.y - usableRect.bottom)
// move toolbar/appbar further down to where it should be and not to overlap with status bar
val layoutParams = ConstraintLayout.LayoutParams(appBarLayout.layoutParams as ConstraintLayout.LayoutParams)
layoutParams.topMargin = getSystemSize(Constants.statusBarHeightKey)
appBarLayout.layoutParams = layoutParams
}
Resultado no modo popup Samsung:
