If you look here, this is the code that is kicking in;
https://www.codeaurora.org/cgit/quic/la/platform/frameworks/base/tree/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java?id=LA.BR.1.2.4-01510-8x16.0#n1719
mNavigationBarCanMove = shortSizeDp < 600;
Basically, on a small screen device, the navigation bar will be permanently affixed to the short edge of the screen. By “move”, it doesn’t actually mean to different parts of the screen physically, it means it can move between “bottom” and “right side” which are defined by how you are holding the device.
So for example, when you hold a portrait cellphone in portrait orientation, the narrow side of the screen is the “bottom”. Rotate it counter-clockwise 90 degrees, and what was once the “bottom” has become the “right”, even though it is physically the same part of the screen.
A “dp” is a density-independent pixel. There are 160 dp’s in an inch, by convention, based on the physical screen resolution of an HTC Dream… since it was the first Android device. So 600 dp = 600/160=3.75 inches. Basically, if the SHORT side of the screen is under 3.75 inches (95.25 mm), then it keeps the nav bar on the short side.
The actual rotation code is in the same file, line 3703.
mNavigationBarOnBottom = (!mNavigationBarCanMove || displayWidth < displayHeight);