diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml
index 15671a2..2495ad6 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -368,7 +368,7 @@
     <item msgid="2262719249581510939">"Desconnectada"</item>
     <item msgid="9141074028293812365">"S\'està inicialitzant..."</item>
     <item msgid="2234425878608626285">"S\'està connectant..."</item>
-    <item msgid="27547778933579155">"Connectat"</item>
+    <item msgid="27547778933579155">"Connectada"</item>
     <item msgid="893506841727300393">"Temps d\'espera esgotat"</item>
     <item msgid="2974952010554140659">"Incorrecte"</item>
   </string-array>
diff --git a/res/values-ne/arrays.xml b/res/values-ne/arrays.xml
index f128b3b..99afd0e 100644
--- a/res/values-ne/arrays.xml
+++ b/res/values-ne/arrays.xml
@@ -404,7 +404,7 @@
     <item msgid="9080166583718385565">"0"</item>
   </string-array>
   <string-array name="wifi_metered_entries">
-    <item msgid="3237321077949659241">"स्वतः पत्ता लगाइयोस्"</item>
+    <item msgid="3237321077949659241">"स्वतः पत्ता लगाउनुहोस्"</item>
     <item msgid="3779092145391320375">"सशुल्क Wi-Fi का रूपमा लिइयोस्"</item>
     <item msgid="2047166446768045816">"नि:शुल्क Wi-Fi का रूपमा लिइयोस्"</item>
   </string-array>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9e1ab8a..1e76855 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4478,8 +4478,14 @@
     <!-- Summary for the modifier key picker dialog page [CHAR LIMIT=35] -->
     <string name="modifier_keys_picker_summary">Choose a new key for <xliff:g id="modifier_key_default_name">%1$s</xliff:g>:</string>
 
+    <!-- Title text for per IME subtype keyboard layout. [CHAR LIMIT=35] -->
+    <string name="ime_label_title"><xliff:g id="ime_label" example="Gboard">%s</xliff:g> layout</string>
     <!-- Summary text for keyboards when no layout has been selected. [CHAR LIMIT=35] -->
     <string name="default_keyboard_layout">Default</string>
+    <!-- Summary text for keyboards when a layout is automatically selected. [CHAR LIMIT=35] -->
+    <string name="automatic_keyboard_layout_label">Automatic: <xliff:g id="layout_label" example="English(US)">%s</xliff:g></string>
+    <!-- Summary text for keyboards when a layout is user selected. [CHAR LIMIT=35] -->
+    <string name="user_selected_keyboard_layout_label">User selected: <xliff:g id="layout_label" example="English(US)">%s</xliff:g></string>
 
     <!-- Title for the 'Speech' preference category. [CHAR LIMIT=45] -->
     <string name="speech_category_title">Speech</string>
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index 6a65dc0..ec63c9a 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -88,6 +88,14 @@
             return info.statusLabel;
         } else if (info.statusLabel != null && !info.discharging) {
             // Charging state
+            if (com.android.settingslib.fuelgauge.BatteryUtils.isChargingStringV2Enabled()) {
+                return info.isFastCharging
+                        ? mContext.getString(
+                                R.string.battery_state_and_duration,
+                                info.statusLabel,
+                                info.remainingLabel)
+                        : info.remainingLabel;
+            }
             return mContext.getString(
                     R.string.battery_state_and_duration, info.statusLabel, info.remainingLabel);
         } else if (mPowerManager.isPowerSaveMode()) {
diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java
index ea8ef8d..904923a 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfo.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfo.java
@@ -37,6 +37,8 @@
 import com.android.settings.Utils;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.UsageView;
+import com.android.settingslib.R;
+import com.android.settingslib.fuelgauge.BatteryStatus;
 import com.android.settingslib.fuelgauge.Estimate;
 import com.android.settingslib.fuelgauge.EstimateKt;
 import com.android.settingslib.utils.PowerUtil;
@@ -52,6 +54,7 @@
     public int pluggedStatus;
     public boolean discharging = true;
     public boolean isBatteryDefender;
+    public boolean isFastCharging;
     public long remainingTimeUs = 0;
     public long averageTimeToDischarge = EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN;
     public String batteryPercentString;
@@ -143,13 +146,13 @@
         parseBatteryHistory(parserList);
         String timeString =
                 context.getString(
-                        com.android.settingslib.R.string.charge_length_format,
+                        R.string.charge_length_format,
                         Formatter.formatShortElapsedTime(context, timePeriod));
         String remaining = "";
         if (remainingTimeUs != 0) {
             remaining =
                     context.getString(
-                            com.android.settingslib.R.string.remaining_length_format,
+                            R.string.remaining_length_format,
                             Formatter.formatShortElapsedTime(context, remainingTimeUs / 1000));
         }
         view.setBottomLabels(new CharSequence[] {timeString, remaining});
@@ -291,8 +294,8 @@
             @NonNull BatteryUsageStats batteryUsageStats,
             Estimate estimate,
             long elapsedRealtimeUs,
-            boolean shortString) {
-        final long startTime = System.currentTimeMillis();
+            boolean shortString,
+            long currentTimeMs) {
         final boolean isCompactStatus =
                 context.getResources()
                         .getBoolean(com.android.settings.R.bool.config_use_compact_battery_status);
@@ -313,22 +316,51 @@
         info.batteryStatus =
                 batteryBroadcast.getIntExtra(
                         BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
+        info.isFastCharging =
+                BatteryStatus.getChargingSpeed(context, batteryBroadcast)
+                        == BatteryStatus.CHARGING_FAST;
         if (!info.mCharging) {
             updateBatteryInfoDischarging(context, shortString, estimate, info);
         } else {
             updateBatteryInfoCharging(
-                    context, batteryBroadcast, batteryUsageStats, info, isCompactStatus);
+                    context,
+                    batteryBroadcast,
+                    batteryUsageStats,
+                    info,
+                    isCompactStatus,
+                    currentTimeMs);
         }
-        BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime);
+        BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", currentTimeMs);
         return info;
     }
 
+    /** Returns a {@code BatteryInfo} with battery and charging relative information. */
+    @WorkerThread
+    public static BatteryInfo getBatteryInfo(
+            Context context,
+            Intent batteryBroadcast,
+            BatteryUsageStats batteryUsageStats,
+            Estimate estimate,
+            long elapsedRealtimeUs,
+            boolean shortString) {
+        long currentTimeMs = System.currentTimeMillis();
+        return getBatteryInfo(
+                context,
+                batteryBroadcast,
+                batteryUsageStats,
+                estimate,
+                elapsedRealtimeUs,
+                shortString,
+                currentTimeMs);
+    }
+
     private static void updateBatteryInfoCharging(
             Context context,
             Intent batteryBroadcast,
             BatteryUsageStats stats,
             BatteryInfo info,
-            boolean compactStatus) {
+            boolean compactStatus,
+            long currentTimeMs) {
         final Resources resources = context.getResources();
         final long chargeTimeMs = stats.getChargeTimeRemainingMs();
         if (getSettingsChargeTimeRemaining(context) != chargeTimeMs) {
@@ -350,7 +382,7 @@
                 || dockDefenderMode == BatteryUtils.DockDefenderMode.ACTIVE) {
             // Battery defender active, battery charging paused
             info.remainingLabel = null;
-            int chargingLimitedResId = com.android.settingslib.R.string.power_charging_limited;
+            int chargingLimitedResId = R.string.power_charging_limited;
             info.chargeLabel = context.getString(chargingLimitedResId, info.batteryPercentString);
         } else if ((chargeTimeMs > 0
                         && status != BatteryManager.BATTERY_STATUS_FULL
@@ -358,30 +390,29 @@
                 || dockDefenderMode == BatteryUtils.DockDefenderMode.TEMPORARILY_BYPASSED) {
             // Battery is charging to full
             info.remainingTimeUs = PowerUtil.convertMsToUs(chargeTimeMs);
-            final CharSequence timeString =
-                    StringUtil.formatElapsedTime(
-                            context,
-                            (double) PowerUtil.convertUsToMs(info.remainingTimeUs),
-                            false /* withSeconds */,
-                            true /* collapseTimeUnit */);
-            int resId = com.android.settingslib.R.string.power_charging_duration;
+
+            int resId = getChargingDurationResId(info.isFastCharging);
             info.remainingLabel =
                     chargeTimeMs <= 0
                             ? null
-                            : context.getString(
-                                    com.android.settingslib.R.string
-                                            .power_remaining_charging_duration_only,
-                                    timeString);
+                            : getPowerRemainingChargingLabel(
+                                    context, chargeTimeMs, info.isFastCharging, currentTimeMs);
+
             info.chargeLabel =
                     chargeTimeMs <= 0
                             ? info.batteryPercentString
-                            : context.getString(resId, info.batteryPercentString, timeString);
+                            : getChargeLabelWithTimeToFull(
+                                    context,
+                                    resId,
+                                    info.batteryPercentString,
+                                    chargeTimeMs,
+                                    info.isFastCharging,
+                                    currentTimeMs);
         } else if (dockDefenderMode == BatteryUtils.DockDefenderMode.FUTURE_BYPASS) {
             // Dock defender will be triggered in the future, charging will be optimized.
             info.chargeLabel =
                     context.getString(
-                            com.android.settingslib.R.string.power_charging_future_paused,
-                            info.batteryPercentString);
+                            R.string.power_charging_future_paused, info.batteryPercentString);
         } else {
             final String chargeStatusLabel =
                     Utils.getBatteryStatus(context, batteryBroadcast, compactStatus);
@@ -390,12 +421,70 @@
                     info.batteryLevel == 100
                             ? info.batteryPercentString
                             : resources.getString(
-                                    com.android.settingslib.R.string.power_charging,
+                                    R.string.power_charging,
                                     info.batteryPercentString,
                                     chargeStatusLabel);
         }
     }
 
+    private static CharSequence getPowerRemainingChargingLabel(
+            Context context, long remainingTimeMs, boolean isFastCharging, long currentTimeMs) {
+        if (com.android.settingslib.fuelgauge.BatteryUtils.isChargingStringV2Enabled()) {
+            int chargeLabelResId =
+                    isFastCharging
+                            ? R.string.power_remaining_fast_charging_duration_only_v2
+                            : R.string.power_remaining_charging_duration_only_v2;
+            String timeString =
+                    PowerUtil.getTargetTimeShortString(context, remainingTimeMs, currentTimeMs);
+            return context.getString(chargeLabelResId, timeString);
+        }
+        final CharSequence timeString =
+                StringUtil.formatElapsedTime(
+                        context,
+                        remainingTimeMs,
+                        /* withSeconds= */ false,
+                        /* collapseTimeUnit= */ true);
+        return context.getString(R.string.power_remaining_charging_duration_only, timeString);
+    }
+
+    private static CharSequence getChargeLabelWithTimeToFull(
+            Context context,
+            int chargeLabelResId,
+            String batteryPercentString,
+            long chargeTimeMs,
+            boolean isFastCharging,
+            long currentTimeMs) {
+        if (com.android.settingslib.fuelgauge.BatteryUtils.isChargingStringV2Enabled()) {
+            var timeString =
+                    PowerUtil.getTargetTimeShortString(context, chargeTimeMs, currentTimeMs);
+
+            return isFastCharging
+                    ? context.getString(
+                            chargeLabelResId,
+                            batteryPercentString,
+                            context.getString(R.string.battery_info_status_charging_fast_v2),
+                            timeString)
+                    : context.getString(chargeLabelResId, batteryPercentString, timeString);
+        } else {
+            var timeString =
+                    StringUtil.formatElapsedTime(
+                            context,
+                            (double) chargeTimeMs,
+                            /* withSeconds= */ false,
+                            /* collapseTimeUnit= */ true);
+            return context.getString(chargeLabelResId, batteryPercentString, timeString);
+        }
+    }
+
+    private static int getChargingDurationResId(boolean isFastCharging) {
+        if (com.android.settingslib.fuelgauge.BatteryUtils.isChargingStringV2Enabled()) {
+            return isFastCharging
+                    ? R.string.power_fast_charging_duration_v2
+                    : R.string.power_charging_duration_v2;
+        }
+        return R.string.power_charging_duration;
+    }
+
     private static void updateBatteryInfoDischarging(
             Context context, boolean shortString, Estimate estimate, BatteryInfo info) {
         final long drainTimeUs = PowerUtil.convertMsToUs(estimate.getEstimateMillis());
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
index 05dc5be..2bbb567 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
@@ -21,6 +21,7 @@
 import android.hardware.input.InputDeviceIdentifier;
 import android.hardware.input.InputManager;
 import android.hardware.input.KeyboardLayout;
+import android.hardware.input.KeyboardLayoutSelectionResult;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -180,7 +181,7 @@
                     mapLanguageWithLayout(info, subtype);
                 }
             }
-            updatePreferenceLayout(preferenceScreen, info);
+            updatePreferenceLayout(preferenceScreen, info, infoList.size() > 1);
         }
     }
 
@@ -189,14 +190,15 @@
         KeyboardLayout[] keyboardLayouts =
                 NewKeyboardSettingsUtils.getKeyboardLayouts(
                         mIm, mUserId, mInputDeviceIdentifier, info, subtype);
-        String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+        KeyboardLayoutSelectionResult result = NewKeyboardSettingsUtils.getKeyboardLayout(
                 mIm, mUserId, mInputDeviceIdentifier, info, subtype);
-        if (layout != null) {
+        if (result.getLayoutDescriptor() != null) {
             for (int i = 0; i < keyboardLayouts.length; i++) {
-                if (keyboardLayouts[i].getDescriptor().equals(layout)) {
+                if (keyboardLayouts[i].getDescriptor().equals(result.getLayoutDescriptor())) {
                     KeyboardInfo keyboardInfo = new KeyboardInfo(
                             subtypeLabel,
                             keyboardLayouts[i].getLabel(),
+                            result.getSelectionCriteria(),
                             info,
                             subtype);
                     mKeyboardInfoList.add(keyboardInfo);
@@ -208,18 +210,22 @@
             KeyboardInfo keyboardInfo = new KeyboardInfo(
                     subtypeLabel,
                     mContext.getString(R.string.keyboard_default_layout),
+                    KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_UNSPECIFIED,
                     info,
                     subtype);
             mKeyboardInfoList.add(keyboardInfo);
         }
     }
 
-    private void updatePreferenceLayout(PreferenceScreen preferenceScreen, InputMethodInfo info) {
+    private void updatePreferenceLayout(PreferenceScreen preferenceScreen, InputMethodInfo info,
+            boolean hasMultipleImes) {
         if (mKeyboardInfoList.isEmpty()) {
             return;
         }
         PreferenceCategory preferenceCategory = new PreferenceCategory(mContext);
-        preferenceCategory.setTitle(info.loadLabel(mContext.getPackageManager()));
+        preferenceCategory.setTitle(hasMultipleImes ? mContext.getString(R.string.ime_label_title,
+                info.loadLabel(mContext.getPackageManager()))
+                : mContext.getString(R.string.enabled_locales_keyboard_layout));
         preferenceCategory.setKey(info.getPackageName());
         preferenceScreen.addPreference(preferenceCategory);
         Collections.sort(mKeyboardInfoList, new Comparator<KeyboardInfo>() {
@@ -234,7 +240,7 @@
             final Preference pref = new Preference(mContext);
             pref.setKey(keyboardInfo.getPrefId());
             pref.setTitle(keyboardInfo.getSubtypeLabel());
-            pref.setSummary(keyboardInfo.getLayout());
+            pref.setSummary(keyboardInfo.getLayoutSummaryText(mContext));
             pref.setOnPreferenceClickListener(
                     preference -> {
                         showKeyboardLayoutPicker(
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
index ac8037f..ec727e8 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
@@ -21,6 +21,7 @@
 import android.hardware.input.InputDeviceIdentifier;
 import android.hardware.input.InputManager;
 import android.hardware.input.KeyboardLayout;
+import android.hardware.input.KeyboardLayoutSelectionResult;
 import android.os.Bundle;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
@@ -201,13 +202,13 @@
 
     private String getSelectedLayoutLabel() {
         String label = mContext.getString(R.string.keyboard_default_layout);
-        String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+        KeyboardLayoutSelectionResult result = NewKeyboardSettingsUtils.getKeyboardLayout(
                 mIm, mUserId, mInputDeviceIdentifier, mInputMethodInfo, mInputMethodSubtype);
         KeyboardLayout[] keyboardLayouts = NewKeyboardSettingsUtils.getKeyboardLayouts(
                 mIm, mUserId, mInputDeviceIdentifier, mInputMethodInfo, mInputMethodSubtype);
-        if (layout != null) {
+        if (result.getLayoutDescriptor() != null) {
             for (KeyboardLayout keyboardLayout : keyboardLayouts) {
-                if (keyboardLayout.getDescriptor().equals(layout)) {
+                if (keyboardLayout.getDescriptor().equals(result.getLayoutDescriptor())) {
                     label = keyboardLayout.getLabel();
                     break;
                 }
diff --git a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
index a927165..8f1e5c8 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
@@ -16,20 +16,30 @@
 
 package com.android.settings.inputmethod;
 
+import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_USER;
+import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_DEVICE;
+import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.UserIdInt;
 import android.content.Context;
 import android.hardware.input.InputDeviceIdentifier;
 import android.hardware.input.InputManager;
 import android.hardware.input.KeyboardLayout;
+import android.hardware.input.KeyboardLayoutSelectionResult;
+import android.hardware.input.KeyboardLayoutSelectionResult.LayoutSelectionCriteria;
 import android.os.UserHandle;
 import android.view.InputDevice;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.InputMethodSubtype;
 
-import java.util.ArrayList;
+import com.android.settings.R;
+
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.List;
 
 /**
  * Utilities of keyboard settings
@@ -56,36 +66,47 @@
         return false;
     }
 
-    static List<String> getSuitableImeLabels(Context context, InputMethodManager imm, int userId) {
-        List<String> suitableInputMethodInfoLabels = new ArrayList<>();
-        List<InputMethodInfo> infoList = imm.getEnabledInputMethodListAsUser(UserHandle.of(userId));
-        for (InputMethodInfo info : infoList) {
-            List<InputMethodSubtype> subtypes =
-                    imm.getEnabledInputMethodSubtypeList(info, true);
-            for (InputMethodSubtype subtype : subtypes) {
-                if (subtype.isSuitableForPhysicalKeyboardLayoutMapping()) {
-                    suitableInputMethodInfoLabels.add(
-                            info.loadLabel(context.getPackageManager()).toString());
-                    break;
+    @SuppressLint("MissingPermission")
+    @Nullable
+    static String getSelectedKeyboardLayoutLabelForUser(Context context, @UserIdInt int userId,
+            InputDeviceIdentifier inputDeviceIdentifier) {
+        InputMethodManager imm = context.getSystemService(InputMethodManager.class);
+        InputManager im = context.getSystemService(InputManager.class);
+        if (imm == null || im == null) {
+            return null;
+        }
+        InputMethodInfo imeInfo = imm.getCurrentInputMethodInfoAsUser(UserHandle.of(userId));
+        InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
+        KeyboardLayout[] keyboardLayouts = getKeyboardLayouts(im, userId, inputDeviceIdentifier,
+                imeInfo, subtype);
+        KeyboardLayoutSelectionResult result = getKeyboardLayout(im, userId, inputDeviceIdentifier,
+                imeInfo, subtype);
+        if (result != null) {
+            for (KeyboardLayout keyboardLayout : keyboardLayouts) {
+                if (keyboardLayout.getDescriptor().equals(result.getLayoutDescriptor())) {
+                    return keyboardLayout.getLabel();
                 }
             }
         }
-        return suitableInputMethodInfoLabels;
+        return null;
     }
 
     static class KeyboardInfo {
         CharSequence mSubtypeLabel;
         String mLayout;
+        @LayoutSelectionCriteria int mSelectionCriteria;
         InputMethodInfo mInputMethodInfo;
         InputMethodSubtype mInputMethodSubtype;
 
         KeyboardInfo(
                 CharSequence subtypeLabel,
                 String layout,
+                @LayoutSelectionCriteria int selectionCriteria,
                 InputMethodInfo inputMethodInfo,
                 InputMethodSubtype inputMethodSubtype) {
             mSubtypeLabel = subtypeLabel;
             mLayout = layout;
+            mSelectionCriteria = selectionCriteria;
             mInputMethodInfo = inputMethodInfo;
             mInputMethodSubtype = inputMethodSubtype;
         }
@@ -102,6 +123,17 @@
             return mLayout;
         }
 
+        String getLayoutSummaryText(Context context) {
+            if (isAutomaticSelection(mSelectionCriteria)) {
+                return context.getResources().getString(R.string.automatic_keyboard_layout_label,
+                        mLayout);
+            } else if (isUserSelection(mSelectionCriteria)) {
+                return context.getResources().getString(
+                        R.string.user_selected_keyboard_layout_label, mLayout);
+            }
+            return mLayout;
+        }
+
         InputMethodInfo getInputMethodInfo() {
             return mInputMethodInfo;
         }
@@ -121,11 +153,21 @@
         return inputManager.getKeyboardLayoutListForInputDevice(identifier, userId, info, subtype);
     }
 
-    static String getKeyboardLayout(InputManager inputManager, int userId,
+    @NonNull
+    static KeyboardLayoutSelectionResult getKeyboardLayout(InputManager inputManager, int userId,
             InputDeviceIdentifier identifier, InputMethodInfo info, InputMethodSubtype subtype) {
         return inputManager.getKeyboardLayoutForInputDevice(identifier, userId, info, subtype);
     }
 
+    static boolean isAutomaticSelection(@LayoutSelectionCriteria int criteria) {
+        return criteria == LAYOUT_SELECTION_CRITERIA_DEVICE
+                || criteria == LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD;
+    }
+
+    static boolean isUserSelection(@LayoutSelectionCriteria int criteria) {
+        return criteria == LAYOUT_SELECTION_CRITERIA_USER;
+    }
+
     static void sortKeyboardLayoutsByLabel(KeyboardLayout[] keyboardLayouts) {
         Arrays.sort(
                 keyboardLayouts,
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index f2ac550..e102241 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -288,19 +288,11 @@
             final Preference pref = new Preference(getPrefContext());
             pref.setTitle(hardKeyboardDeviceInfo.mDeviceName);
             if (mIsNewKeyboardSettings) {
-                List<String> suitableImes = new ArrayList<>();
-                suitableImes.addAll(
-                        NewKeyboardSettingsUtils.getSuitableImeLabels(
-                                getContext(), mImm, UserHandle.myUserId()));
-                if (!suitableImes.isEmpty()) {
-                    String summary = suitableImes.get(0);
-                    StringBuilder result = new StringBuilder(summary);
-                    for (int i = 1; i < suitableImes.size(); i++) {
-                        result.append(", ").append(suitableImes.get(i));
-                    }
-                    pref.setSummary(result.toString());
-                } else {
-                    pref.setSummary(hardKeyboardDeviceInfo.mLayoutLabel);
+                String currentLayout =
+                        NewKeyboardSettingsUtils.getSelectedKeyboardLayoutLabelForUser(getContext(),
+                                UserHandle.myUserId(), hardKeyboardDeviceInfo.mDeviceIdentifier);
+                if (currentLayout != null) {
+                    pref.setSummary(currentLayout);
                 }
                 pref.setOnPreferenceClickListener(
                         preference -> {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 1df8a40..9fa9651 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -44,6 +44,7 @@
 import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
 import com.android.settings.testutils.shadow.ShadowUtils;
 import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.fuelgauge.BatteryUtils;
 import com.android.settingslib.widget.UsageProgressBarPreference;
 
 import org.junit.After;
@@ -107,6 +108,8 @@
         mController = spy(new BatteryHeaderPreferenceController(mContext, PREF_KEY));
         mController.mBatteryUsageProgressBarPref = mBatteryUsageProgressBarPref;
         mController.mBatteryStatusFeatureProvider = mBatteryStatusFeatureProvider;
+
+        BatteryUtils.setChargingStringV2Enabled(null);
     }
 
     @After
@@ -226,6 +229,65 @@
     }
 
     @Test
+    public void updateBatteryStatus_chargingString_statusWithRemainingLabel() {
+        var batteryInfo =
+                arrangeUpdateBatteryStatusTestWithRemainingLabel(
+                        /* remainingLabel= */ "1 hr, 40 min left until full",
+                        /* statusLabel= */ "Charging rapidly",
+                        /* isFastCharging= */ true,
+                        /* isChargingStringV2= */ false);
+        var expectedChargingString = batteryInfo.statusLabel + " • " + batteryInfo.remainingLabel;
+
+        mController.updateBatteryStatus(/* label= */ null, batteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString);
+    }
+
+    @Test
+    public void updateBatteryStatus_chargingStringV2FastCharging_statusWithRemainingLabel() {
+        var batteryInfo =
+                arrangeUpdateBatteryStatusTestWithRemainingLabel(
+                        /* remainingLabel= */ "Full by 1:30 PM",
+                        /* statusLabel= */ "Fast Charging",
+                        /* isFastCharging= */ true,
+                        /* isChargingStringV2= */ true);
+        var expectedChargingString = batteryInfo.statusLabel + " • " + batteryInfo.remainingLabel;
+
+        mController.updateBatteryStatus(/* label= */ null, batteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString);
+    }
+
+    @Test
+    public void updateBatteryStatus_chargingStringV2NonFastCharging_remainingLabel() {
+        var batteryInfo =
+                arrangeUpdateBatteryStatusTestWithRemainingLabel(
+                        /* remainingLabel= */ "Fully charged by 11:10 PM",
+                        /* statusLabel= */ "Charging",
+                        /* isFastCharging= */ false,
+                        /* isChargingStringV2= */ true);
+        var expectedChargingString = batteryInfo.remainingLabel;
+
+        mController.updateBatteryStatus(/* label= */ null, batteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString);
+    }
+
+    private BatteryInfo arrangeUpdateBatteryStatusTestWithRemainingLabel(
+            String remainingLabel,
+            String statusLabel,
+            boolean isFastCharging,
+            boolean isChargingStringV2) {
+        BatteryUtils.setChargingStringV2Enabled(isChargingStringV2);
+        mBatteryInfo.isBatteryDefender = false;
+        mBatteryInfo.remainingLabel = remainingLabel;
+        mBatteryInfo.statusLabel = statusLabel;
+        mBatteryInfo.discharging = false;
+        mBatteryInfo.isFastCharging = isFastCharging;
+        return mBatteryInfo;
+    }
+
+    @Test
     public void updateHeaderByBatteryTips_lowBatteryTip_showLowBattery() {
         setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
         BatteryTip lowBatteryTip =
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
index e99c4e0..e632596 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -30,12 +31,14 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.AlarmManager;
 import android.content.Context;
 import android.content.Intent;
 import android.os.BatteryManager;
 import android.os.BatteryStats;
 import android.os.BatteryUsageStats;
 import android.os.SystemClock;
+import android.os.SystemProperties;
 import android.provider.Settings;
 import android.util.SparseIntArray;
 
@@ -56,6 +59,9 @@
 import org.robolectric.RuntimeEnvironment;
 
 import java.time.Duration;
+import java.time.Instant;
+import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 @RunWith(RobolectricTestRunner.class)
@@ -80,11 +86,23 @@
                     1000, /* estimateMillis */
                     false, /* isBasedOnUsage */
                     1000 /* averageDischargeTime */);
+    private static final Map<ChargingType, Integer> CHARGING_TYPE_MAP =
+            Map.of(
+                    ChargingType.WIRED, BatteryManager.BATTERY_PLUGGED_AC,
+                    ChargingType.WIRELESS, BatteryManager.BATTERY_PLUGGED_WIRELESS,
+                    ChargingType.DOCKED, BatteryManager.BATTERY_PLUGGED_DOCK);
+    private static final Map<ChargingSpeed, Integer> CHARGING_SPEED_MAP =
+            Map.of(
+                    ChargingSpeed.FAST, 1501000,
+                    ChargingSpeed.REGULAR, 1500000,
+                    ChargingSpeed.SLOW, 999999);
+    private static final long UNUSED_TIME_MS = -1L;
 
     private Intent mDisChargingBatteryBroadcast;
     private Intent mChargingBatteryBroadcast;
     private Context mContext;
     private FakeFeatureFactory mFeatureFactory;
+
     @Mock private BatteryUsageStats mBatteryUsageStats;
 
     @Before
@@ -102,10 +120,13 @@
                 mContext.getContentResolver(),
                 BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS,
                 0);
+
+        // Reset static cache for testing purpose.
+        com.android.settingslib.fuelgauge.BatteryUtils.setChargingStringV2Enabled(null);
     }
 
     @Test
-    public void testGetBatteryInfo_hasStatusLabel() {
+    public void getBatteryInfo_hasStatusLabel() {
         doReturn(REMAINING_TIME_NULL).when(mBatteryUsageStats).getBatteryTimeRemainingMs();
         BatteryInfo info =
                 BatteryInfo.getBatteryInfoOld(
@@ -119,7 +140,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_doNotShowChargingMethod_hasRemainingTime() {
+    public void getBatteryInfo_doNotShowChargingMethod_hasRemainingTime() {
         doReturn(REMAINING_TIME).when(mBatteryUsageStats).getChargeTimeRemainingMs();
         BatteryInfo info =
                 BatteryInfo.getBatteryInfoOld(
@@ -133,7 +154,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_doNotShowChargingMethod_noRemainingTime() {
+    public void getBatteryInfo_doNotShowChargingMethod_noRemainingTime() {
         doReturn(REMAINING_TIME_NULL).when(mBatteryUsageStats).getChargeTimeRemainingMs();
         BatteryInfo info =
                 BatteryInfo.getBatteryInfoOld(
@@ -147,7 +168,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_pluggedInUsingShortString_usesCorrectData() {
+    public void getBatteryInfo_pluggedInUsingShortString_usesCorrectData() {
         doReturn(TEST_CHARGE_TIME_REMAINING / 1000)
                 .when(mBatteryUsageStats)
                 .getChargeTimeRemainingMs();
@@ -164,7 +185,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_basedOnUsageTrueMoreThanFifteenMinutes_usesCorrectString() {
+    public void getBatteryInfo_basedOnUsageTrueMoreThanFifteenMinutes_usesCorrectString() {
         Estimate estimate =
                 new Estimate(
                         Duration.ofHours(4).toMillis(),
@@ -215,7 +236,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() {
+    public void getBatteryInfo_basedOnUsageFalse_usesDefaultString() {
         BatteryInfo info =
                 BatteryInfo.getBatteryInfo(
                         mContext,
@@ -238,7 +259,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_charging_usesChargeTime() {
+    public void getBatteryInfo_charging_usesChargeTime() {
         doReturn(TEST_CHARGE_TIME_REMAINING / 1000)
                 .when(mBatteryUsageStats)
                 .getChargeTimeRemainingMs();
@@ -258,7 +279,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_pluggedInWithFullBattery_onlyShowBatteryLevel() {
+    public void getBatteryInfo_pluggedInWithFullBattery_onlyShowBatteryLevel() {
         mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_LEVEL, 100);
 
         BatteryInfo info =
@@ -274,7 +295,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_chargingWithDefender_updateChargeLabel() {
+    public void getBatteryInfo_chargingWithDefender_updateChargeLabel() {
         doReturn(TEST_CHARGE_TIME_REMAINING).when(mBatteryUsageStats).getChargeTimeRemainingMs();
         mChargingBatteryBroadcast.putExtra(
                 BatteryManager.EXTRA_CHARGING_STATUS,
@@ -294,7 +315,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_getChargeTimeRemaining_updateSettingsGlobal() {
+    public void getBatteryInfo_getChargeTimeRemaining_updateSettingsGlobal() {
         doReturn(TEST_CHARGE_TIME_REMAINING).when(mBatteryUsageStats).getChargeTimeRemainingMs();
 
         BatteryInfo.getBatteryInfo(
@@ -310,7 +331,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_differentChargeTimeRemaining_updateSettingsGlobal() {
+    public void getBatteryInfo_differentChargeTimeRemaining_updateSettingsGlobal() {
         doReturn(TEST_CHARGE_TIME_REMAINING).when(mBatteryUsageStats).getChargeTimeRemainingMs();
         final long newTimeToFull = 300L;
         doReturn(newTimeToFull).when(mBatteryUsageStats).getChargeTimeRemainingMs();
@@ -327,16 +348,15 @@
     }
 
     @Test
-    public void testGetBatteryInfo_dockDefenderActive_updateChargeString() {
+    public void getBatteryInfo_dockDefenderActive_updateChargeString() {
         doReturn(TEST_CHARGE_TIME_REMAINING / 1000)
                 .when(mBatteryUsageStats)
                 .getChargeTimeRemainingMs();
         doReturn(true).when(mFeatureFactory.powerUsageFeatureProvider).isExtraDefend();
         Intent intent =
-                BatteryTestUtils.getCustomBatteryIntent(
+                createBatteryIntent(
                                 BatteryManager.BATTERY_PLUGGED_DOCK,
-                                50 /* level */,
-                                100 /* scale */,
+                                /* level= */ 50,
                                 BatteryManager.BATTERY_STATUS_CHARGING)
                         .putExtra(
                                 BatteryManager.EXTRA_CHARGING_STATUS,
@@ -355,7 +375,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_dockDefenderTemporarilyBypassed_updateChargeLabel() {
+    public void getBatteryInfo_dockDefenderTemporarilyBypassed_updateChargeLabel() {
         doReturn(REMAINING_TIME).when(mBatteryUsageStats).getChargeTimeRemainingMs();
         mChargingBatteryBroadcast.putExtra(
                 BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT);
@@ -367,10 +387,9 @@
         BatteryInfo info =
                 BatteryInfo.getBatteryInfo(
                         mContext,
-                        BatteryTestUtils.getCustomBatteryIntent(
+                        createBatteryIntent(
                                 BatteryManager.BATTERY_PLUGGED_DOCK,
-                                50 /* level */,
-                                100 /* scale */,
+                                /* level= */ 50,
                                 BatteryManager.BATTERY_STATUS_CHARGING),
                         mBatteryUsageStats,
                         MOCK_ESTIMATE,
@@ -381,7 +400,7 @@
     }
 
     @Test
-    public void testGetBatteryInfo_dockDefenderFutureBypass_updateChargeLabel() {
+    public void getBatteryInfo_dockDefenderFutureBypass_updateChargeLabel() {
         doReturn(false).when(mFeatureFactory.powerUsageFeatureProvider).isExtraDefend();
         mChargingBatteryBroadcast.putExtra(
                 BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT);
@@ -389,10 +408,9 @@
         BatteryInfo info =
                 BatteryInfo.getBatteryInfo(
                         mContext,
-                        BatteryTestUtils.getCustomBatteryIntent(
+                        createBatteryIntent(
                                 BatteryManager.BATTERY_PLUGGED_DOCK,
-                                50 /* level */,
-                                100 /* scale */,
+                                /* level= */ 50,
                                 BatteryManager.BATTERY_STATUS_CHARGING),
                         mBatteryUsageStats,
                         MOCK_ESTIMATE,
@@ -402,6 +420,284 @@
         assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_FUTURE_BYPASS);
     }
 
+    @Test
+    public void getBatteryInfo_fastCharging_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofMinutes(90).toMillis(),
+                /* chargingStringV2Enabled= */ false);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRED, ChargingSpeed.FAST, /* batteryLevel= */ 61);
+        var expectedStatusLabel = "Charging rapidly";
+        var expectedRemainingLabel = "1 hr, 30 min left until full";
+        var expectedChargeLabel = "61% - " + expectedRemainingLabel;
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                /* currentTimeMillis= */ UNUSED_TIME_MS,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_regularCharging_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofMinutes(80).toMillis(),
+                /* chargingStringV2Enabled= */ false);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRED, ChargingSpeed.REGULAR, /* batteryLevel= */ 33);
+        var expectedStatusLabel = "Charging";
+        var expectedRemainingLabel = "1 hr, 20 min left until full";
+        var expectedChargeLabel = "33% - " + expectedRemainingLabel;
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                /* currentTimeMillis= */ UNUSED_TIME_MS,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_slowCharging_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofMinutes(100).toMillis(),
+                /* chargingStringV2Enabled= */ false);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRED, ChargingSpeed.SLOW, /* batteryLevel= */ 53);
+        var expectedStatusLabel = "Charging slowly";
+        var expectedRemainingLabel = "1 hr, 40 min left until full";
+        var expectedChargeLabel = "53% - " + expectedRemainingLabel;
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                /* currentTimeMillis= */ UNUSED_TIME_MS,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_wirelessCharging_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofMinutes(130).toMillis(),
+                /* chargingStringV2Enabled= */ false);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRELESS, ChargingSpeed.REGULAR, /* batteryLevel= */ 10);
+        var expectedStatusLabel = "Charging wirelessly";
+        var expectedRemainingLabel = "2 hr, 10 min left until full";
+        var expectedChargeLabel = "10% - " + expectedRemainingLabel;
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                /* currentTimeMillis= */ UNUSED_TIME_MS,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_dockedCharging_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofMinutes(30).toMillis(),
+                /* chargingStringV2Enabled= */ false);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.DOCKED, ChargingSpeed.REGULAR, /* batteryLevel= */ 51);
+        var expectedStatusLabel = "Charging";
+        var expectedRemainingLabel = "30 min left until full";
+        var expectedChargeLabel = "51% - " + expectedRemainingLabel;
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                /* currentTimeMillis= */ UNUSED_TIME_MS,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_fastChargingV2_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofMinutes(30).toMillis(),
+                /* chargingStringV2Enabled= */ true);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRED, ChargingSpeed.FAST, /* batteryLevel= */ 56);
+        var expectedStatusLabel = "Fast charging";
+        var expectedRemainingLabel = "Full by 1:30 PM";
+        var expectedChargeLabel = "56% - " + expectedStatusLabel + " - " + expectedRemainingLabel;
+        var currentTimeMillis = Instant.parse("2024-04-01T13:00:00Z").toEpochMilli();
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                currentTimeMillis,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_regularChargingV2_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofHours(1).toMillis(),
+                /* chargingStringV2Enabled= */ true);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRED, ChargingSpeed.REGULAR, /* batteryLevel= */ 12);
+        var expectedStatusLabel = "Charging";
+        var expectedRemainingLabel = "Fully charged by 2:00 PM";
+        var expectedChargeLabel = "12% - " + expectedRemainingLabel;
+        var currentTimeMillis = Instant.parse("2024-04-01T13:00:00Z").toEpochMilli();
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                currentTimeMillis,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_slowChargingV2_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofHours(2).toMillis(),
+                /* chargingStringV2Enabled= */ true);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRED, ChargingSpeed.SLOW, /* batteryLevel= */ 18);
+        var expectedStatusLabel = "Charging";
+        var expectedRemainingLabel = "Fully charged by 3:00 PM";
+        var expectedChargeLabel = "18% - " + expectedRemainingLabel;
+        var currentTimeMillis = Instant.parse("2024-04-01T13:00:00Z").toEpochMilli();
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                currentTimeMillis,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_wirelessChargingV2_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofHours(1).toMillis(),
+                /* chargingStringV2Enabled= */ true);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.WIRELESS, ChargingSpeed.REGULAR, /* batteryLevel= */ 45);
+        var expectedStatusLabel = "Charging";
+        var expectedRemainingLabel = "Fully charged by 4:00 PM";
+        var expectedChargeLabel = "45% - " + expectedRemainingLabel;
+        var currentTimeMillis = Instant.parse("2024-04-01T15:00:00Z").toEpochMilli();
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                currentTimeMillis,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    @Test
+    public void getBatteryInfo_dockedChargingV2_updateRemainingLabelAndStatusLabel() {
+        prepareTestGetBatteryInfoEnvironment(
+                /* remainingTimeMs= */ Duration.ofHours(1).toMillis(),
+                /* chargingStringV2Enabled= */ true);
+        Intent batteryIntent =
+                createIntentForGetBatteryInfoTest(
+                        ChargingType.DOCKED, ChargingSpeed.REGULAR, /* batteryLevel= */ 66);
+        var expectedStatusLabel = "Charging";
+        var expectedRemainingLabel = "Fully charged by 2:00 PM";
+        var expectedChargeLabel = "66% - " + expectedRemainingLabel;
+        var currentTimeMillis = Instant.parse("2021-02-09T13:00:00.00Z").toEpochMilli();
+
+        assertGetBatteryInfo(
+                batteryIntent,
+                currentTimeMillis,
+                expectedStatusLabel,
+                expectedRemainingLabel,
+                expectedChargeLabel);
+    }
+
+    private enum ChargingSpeed {
+        FAST,
+        REGULAR,
+        SLOW
+    }
+
+    private enum ChargingType {
+        WIRED,
+        WIRELESS,
+        DOCKED
+    }
+
+    private Intent createIntentForGetBatteryInfoTest(
+            ChargingType chargingType, ChargingSpeed chargingSpeed, int batteryLevel) {
+        return createBatteryIntent(
+                        CHARGING_TYPE_MAP.get(chargingType),
+                        batteryLevel,
+                        BatteryManager.BATTERY_STATUS_CHARGING)
+                .putExtra(
+                        BatteryManager.EXTRA_MAX_CHARGING_CURRENT,
+                        CHARGING_SPEED_MAP.get(chargingSpeed))
+                .putExtra(BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, 5000000);
+    }
+
+    private void prepareTestGetBatteryInfoEnvironment(
+            long remainingTimeMs, boolean chargingStringV2Enabled) {
+        when(mBatteryUsageStats.getChargeTimeRemainingMs()).thenReturn(remainingTimeMs);
+        SystemProperties.set(
+                com.android.settingslib.fuelgauge.BatteryUtils.PROPERTY_CHARGING_STRING_V2_KEY,
+                String.valueOf(chargingStringV2Enabled));
+        Settings.Global.putInt(
+                mContext.getContentResolver(),
+                BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS,
+                1);
+    }
+
+    private void assertGetBatteryInfo(
+            Intent batteryIntent,
+            long currentTimeMillis,
+            String expectedStatusLabel,
+            String expectedRemainingLabel,
+            String expectedChargeLabel) {
+        mContext.getResources().getConfiguration().setLocale(Locale.US);
+        mContext.getSystemService(AlarmManager.class).setTimeZone("UTC");
+        var info =
+                BatteryInfo.getBatteryInfo(
+                        mContext,
+                        batteryIntent,
+                        mBatteryUsageStats,
+                        MOCK_ESTIMATE,
+                        /* elapsedRealtimeUs= */ UNUSED_TIME_MS,
+                        /* shortString= */ false,
+                        /* currentTimeMillis= */ currentTimeMillis);
+
+        assertWithMessage("statusLabel is incorrect")
+                .that(info.statusLabel)
+                .isEqualTo(expectedStatusLabel);
+        assertWithMessage("remainingLabel is incorrect")
+                .that(info.remainingLabel.toString())
+                .isEqualTo(expectedRemainingLabel);
+        assertWithMessage("chargeLabel is incorrect")
+                .that(info.chargeLabel.toString())
+                .isEqualTo(expectedChargeLabel);
+    }
+
+    private static Intent createBatteryIntent(int plugged, int level, int status) {
+        return new Intent()
+                .putExtra(BatteryManager.EXTRA_PLUGGED, plugged)
+                .putExtra(BatteryManager.EXTRA_LEVEL, level)
+                .putExtra(BatteryManager.EXTRA_SCALE, 100)
+                .putExtra(BatteryManager.EXTRA_STATUS, status);
+    }
+
     // Make our battery stats return a sequence of battery events.
     private void mockBatteryStatsHistory() {
         // Mock out new data every time iterateBatteryStatsHistory is called.
