diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
index 054ce61..08b8fd0 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
@@ -169,9 +169,11 @@
 
     private void mapLanguageWithLayout(InputMethodInfo info, InputMethodSubtype subtype) {
         CharSequence subtypeLabel = getSubtypeLabel(mContext, info, subtype);
-        KeyboardLayout[] keyboardLayouts = getKeyboardLayouts(info, subtype);
-        String layout = getKeyboardLayout(info, subtype);
-
+        KeyboardLayout[] keyboardLayouts =
+                NewKeyboardSettingsUtils.getKeyboardLayouts(
+                        mIm, mUserId, mInputDeviceIdentifier, info, subtype);
+        String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+                mIm, mUserId, mInputDeviceIdentifier, info, subtype);
         if (layout != null) {
             for (int i = 0; i < keyboardLayouts.length; i++) {
                 if (keyboardLayouts[i].getDescriptor().equals(layout)) {
@@ -220,7 +222,6 @@
                     preference -> {
                         showKeyboardLayoutPicker(
                                 keyboardInfo.getSubtypeLabel(),
-                                keyboardInfo.getLayout(),
                                 mInputDeviceIdentifier,
                                 mUserId,
                                 keyboardInfo.getInputMethodInfo(),
@@ -267,7 +268,6 @@
 
     private void showKeyboardLayoutPicker(
             CharSequence subtypeLabel,
-            String layout,
             InputDeviceIdentifier inputDeviceIdentifier,
             int userId,
             InputMethodInfo inputMethodInfo,
@@ -281,7 +281,6 @@
                 NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_SUBTYPE, inputMethodSubtype);
         arguments.putInt(NewKeyboardSettingsUtils.EXTRA_USER_ID, userId);
         arguments.putCharSequence(NewKeyboardSettingsUtils.EXTRA_TITLE, subtypeLabel);
-        arguments.putString(NewKeyboardSettingsUtils.EXTRA_KEYBOARD_LAYOUT, layout);
         new SubSettingLauncher(mContext)
                 .setSourceMetricsCategory(getMetricsCategory())
                 .setDestination(NewKeyboardLayoutPickerFragment.class.getName())
@@ -289,16 +288,6 @@
                 .launch();
     }
 
-    private KeyboardLayout[] getKeyboardLayouts(InputMethodInfo info, InputMethodSubtype subtype) {
-        return mIm.getKeyboardLayoutListForInputDevice(
-                mInputDeviceIdentifier, mUserId, info, subtype);
-    }
-
-    private String getKeyboardLayout(InputMethodInfo info, InputMethodSubtype subtype) {
-        return mIm.getKeyboardLayoutForInputDevice(
-                mInputDeviceIdentifier, mUserId, info, subtype);
-    }
-
     private CharSequence getSubtypeLabel(
             Context context, InputMethodInfo info, InputMethodSubtype subtype) {
         return subtype.getDisplayName(
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java
index 110147a..1af001b 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.hardware.input.InputDeviceIdentifier;
 import android.hardware.input.InputManager;
+import android.hardware.input.KeyboardLayout;
 import android.os.Bundle;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
@@ -31,28 +32,50 @@
 
     private static final String TAG = "KeyboardLayoutPicker";
 
+    private InputManager mIm;
+    private int mUserId;
+    private InputDeviceIdentifier mIdentifier;
+    private InputMethodInfo mInputMethodInfo;
+    private InputMethodSubtype mInputMethodSubtype;
+
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        InputManager inputManager = getContext().getSystemService(InputManager.class);
+        mIm = getContext().getSystemService(InputManager.class);
         Bundle arguments = getArguments();
         final CharSequence title = arguments.getCharSequence(NewKeyboardSettingsUtils.EXTRA_TITLE);
-        final String layout = arguments.getString(NewKeyboardSettingsUtils.EXTRA_KEYBOARD_LAYOUT);
-        final int userId = arguments.getInt(NewKeyboardSettingsUtils.EXTRA_USER_ID);
-        final InputDeviceIdentifier identifier =
+        mUserId = arguments.getInt(NewKeyboardSettingsUtils.EXTRA_USER_ID);
+        mIdentifier =
                 arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER);
-        final InputMethodInfo inputMethodInfo =
+        mInputMethodInfo =
                 arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_INFO);
-        final InputMethodSubtype inputMethodSubtype =
+        mInputMethodSubtype =
                 arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_SUBTYPE);
-        if (identifier == null
-                || NewKeyboardSettingsUtils.getInputDevice(inputManager, identifier) == null) {
+        if (mIdentifier == null
+                || NewKeyboardSettingsUtils.getInputDevice(mIm, mIdentifier) == null) {
             getActivity().finish();
             return;
         }
         getActivity().setTitle(title);
-        use(NewKeyboardLayoutPickerController.class).initialize(this /*parent*/, userId,
-                identifier, inputMethodInfo, inputMethodSubtype, layout);
+        use(NewKeyboardLayoutPickerController.class).initialize(this /*parent*/, mUserId,
+                mIdentifier, mInputMethodInfo, mInputMethodSubtype, getSelectedLayoutLabel());
+    }
+
+    private String getSelectedLayoutLabel() {
+        String label = getContext().getString(R.string.keyboard_default_layout);
+        String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+                mIm, mUserId, mIdentifier, mInputMethodInfo, mInputMethodSubtype);
+        KeyboardLayout[] keyboardLayouts = NewKeyboardSettingsUtils.getKeyboardLayouts(
+                mIm, mUserId, mIdentifier, mInputMethodInfo, mInputMethodSubtype);
+        if (layout != null) {
+            for (int i = 0; i < keyboardLayouts.length; i++) {
+                if (keyboardLayouts[i].getDescriptor().equals(layout)) {
+                    label = keyboardLayouts[i].getLabel();
+                    break;
+                }
+            }
+        }
+        return label;
     }
 
     @Override
diff --git a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
index fe0c9d4..697c0f0 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.hardware.input.InputDeviceIdentifier;
 import android.hardware.input.InputManager;
+import android.hardware.input.KeyboardLayout;
 import android.view.InputDevice;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -39,7 +40,6 @@
             "com.android.settings.inputmethod.EXTRA_INTENT_FROM";
 
     static final String EXTRA_TITLE = "keyboard_layout_picker_title";
-    static final String EXTRA_KEYBOARD_LAYOUT = "keyboard_layout";
     static final String EXTRA_USER_ID = "user_id";
     static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
     static final String EXTRA_INPUT_METHOD_INFO = "input_method_info";
@@ -117,4 +117,14 @@
     static InputDevice getInputDevice(InputManager im, InputDeviceIdentifier identifier) {
         return im.getInputDeviceByDescriptor(identifier.getDescriptor());
     }
+
+    static KeyboardLayout[] getKeyboardLayouts(InputManager inputManager, int userId,
+            InputDeviceIdentifier identifier, InputMethodInfo info, InputMethodSubtype subtype) {
+        return inputManager.getKeyboardLayoutListForInputDevice(identifier, userId, info, subtype);
+    }
+
+    static String getKeyboardLayout(InputManager inputManager, int userId,
+            InputDeviceIdentifier identifier, InputMethodInfo info, InputMethodSubtype subtype) {
+        return inputManager.getKeyboardLayoutForInputDevice(identifier, userId, info, subtype);
+    }
 }
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index 22f5b65..936de38 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -67,12 +67,14 @@
     private static final String SHOW_VIRTUAL_KEYBOARD_SWITCH = "show_virtual_keyboard_switch";
     private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper";
     private static final String MODIFIER_KEYS_SETTINGS = "modifier_keys_settings";
+    private static final String EXTRA_AUTO_SELECTION = "auto_selection";
 
     @NonNull
     private final ArrayList<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>();
 
     private InputManager mIm;
     private InputMethodManager mImm;
+    private InputDeviceIdentifier mAutoInputDeviceIdentifier;
     @NonNull
     private PreferenceCategory mKeyboardAssistanceCategory;
     @NonNull
@@ -85,6 +87,12 @@
     private String mBluetoothAddress;
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        outState.putParcelable(EXTRA_AUTO_SELECTION, mAutoInputDeviceIdentifier);
+        super.onSaveInstanceState(outState);
+    }
+
+    @Override
     public void onCreatePreferences(Bundle bundle, String s) {
         Activity activity = Preconditions.checkNotNull(getActivity());
         addPreferencesFromResource(R.xml.physical_keyboard_settings);
@@ -107,15 +115,19 @@
                 KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER);
         // TODO (b/271391879): The EXTRA_INTENT_FROM is used for the future metrics.
         if (inputDeviceIdentifier != null) {
-            Bundle arguments = new Bundle();
-            arguments.putParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER,
-                    inputDeviceIdentifier);
-            new SubSettingLauncher(getContext())
-                    .setSourceMetricsCategory(getMetricsCategory())
-                    .setDestination(NewKeyboardLayoutEnabledLocalesFragment.class.getName())
-                    .setArguments(arguments)
-                    .launch();
+            mAutoInputDeviceIdentifier = inputDeviceIdentifier;
         }
+        // Don't repeat the autoselection.
+        if (isAutoSelection(bundle, inputDeviceIdentifier)) {
+            showEnabledLocalesKeyboardLayoutList(inputDeviceIdentifier);
+        }
+    }
+
+    private static boolean isAutoSelection(Bundle bundle, InputDeviceIdentifier identifier) {
+        if (bundle != null && bundle.getParcelable(EXTRA_AUTO_SELECTION) != null) {
+            return false;
+        }
+        return identifier != null;
     }
 
     @Override
@@ -220,7 +232,6 @@
                 pref.setOnPreferenceClickListener(
                         preference -> {
                             showEnabledLocalesKeyboardLayoutList(
-                                    hardKeyboardDeviceInfo.mDeviceName,
                                     hardKeyboardDeviceInfo.mDeviceIdentifier);
                             return true;
                         });
@@ -246,8 +257,7 @@
         fragment.show(getActivity().getSupportFragmentManager(), "keyboardLayout");
     }
 
-    private void showEnabledLocalesKeyboardLayoutList(String keyboardName,
-            InputDeviceIdentifier inputDeviceIdentifier) {
+    private void showEnabledLocalesKeyboardLayoutList(InputDeviceIdentifier inputDeviceIdentifier) {
         Bundle arguments = new Bundle();
         arguments.putParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER,
                 inputDeviceIdentifier);
