En Android 13, al conectar una pantalla externa, el sistema muestra una barra de tareas en la parte inferior y los botones de navegación (atrás, inicio, recientes) se desplazan hacia la derecha. Este comportamiento es similar al de Android 12, pero difiere de versiones anteriores. En Android 12 se podía desactivar la barra de tareas cambiando ENABLE_TASKBAR en Launcher3, pero en Android 13 esa propiedad ya no existe.
La lógica que controla la visibilidad de la barra de tareas en Android 13 se encuentra en packages/apps/Launcher3/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java, concretamente en el método recreateTaskbar(). Analicemos su estructura:
// Pseudocódigo del método original
public void recreateTaskbar() {
DeviceProfile dp = mUserUnlocked ?
LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
destroyExistingTaskbar();
// Variable que determina si la barra de tareas debe mostrarse
boolean isTaskBarEnabled = dp != null && isTaskbarPresent(dp);
if (!isTaskBarEnabled) {
SystemUiProxy.INSTANCE.get(mContext)
.notifyTaskbarStatus(false, false);
return;
}
// ... resto del código que crea la barra de tareas
}
El valor de isTaskBarEnabled depende de isTaskbarPresent(dp):
private boolean isTaskbarPresent(DeviceProfile deviceProfile) {
return FLAG_HIDE_NAVBAR_WINDOW || deviceProfile.isTaskbarPresent;
}
A su vez, isTaskbarPresent se define en DeviceProfile.java y se basa en si el dispositivo es considerado tablet según DisplayController.isTablet():
// En DeviceProfile (constructor)
isTablet = info.isTablet(windowBounds);
isTaskbarPresent = isTablet && ApiWrapper.TASKBAR_DRAWN_IN_PROCESS;
// En DisplayController
public boolean isTablet(WindowBounds bounds) {
return smallestSizeDp(bounds) >= MIN_TABLET_WIDTH; // MIN_TABLET_WIDTH = 600
}
Para deshabilitar por completo la barra de tareas en pantallas grandes, podemos forzar que isTaskbarPresent retorne false en todos los puntos donde se evalúa. A continuación se muestra un conjunto de cambios que logran este objetivo, reestructurando la lógica para evitar la comprobación de tablet:
// En frameworks/base/core/res/res/values/config.xml
<bool name="config_navBarCanMove">false</bool> // Antes: true
// En SystemUI/shared/.../Utilities.java
public static boolean isTabletOverride(...) {
return false; // Se fuerza a falso, ignorando smallestWidth >= TABLET_MIN_DPS
}
// En Launcher3/taskbar/TaskbarManager.java
boolean isTaskBarEnabled = false; // Directamente falso, sin evaluar dp ni isTaskbarPresent
// En Launcher3/DeviceProfile.java o DisplayController.java
public boolean isTablet(WindowBounds bounds) {
return false; // Nunca se considera tablet
}
// En Launcher3/states/RotationHelper.java
public static boolean isTabletDevice(...) {
return false; // No permite rotación por ser tablet
}
// En Launcher3/util/window/WindowManagerProxy.java
boolean isTablet = false; // Tanto en el cálculo por configuración como por smallestWidth
Con estos cambios, el sistema dejará de mostrar la barra de tareas y los botones de navegación volverán a su posición habitual en la parte inferior centrada, en lugar de estar desplazados a la derecha.
Nota: Las modificaciones afectan a varios archivos del framework y de Launcher3. Es recomendable realizarlas en un árbol de fuentes de AOSP y recompilar las particiones correspondientes (SystemUI, Launcher3, framework-res).