diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 86cb203..1c8acd0 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -178,7 +178,7 @@
         return timeUs / 1000;
     }
 
-    private long convertMsToUs(long timeMs) {
+    public long convertMsToUs(long timeMs) {
         return timeMs * 1000;
     }
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index b39fcfc..d22ceef 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -189,12 +189,11 @@
                     } finally {
                         cursor.close();
                     }
-                    final long elapsedRealtimeUs = SystemClock.elapsedRealtime() * 1000;
+                    final long elapsedRealtimeUs =
+                            mBatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
                     Intent batteryBroadcast = getContext().registerReceiver(null,
                             new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-                    BatteryInfo batteryInfo = BatteryInfo.getBatteryInfo(getContext(),
-                            batteryBroadcast, mStatsHelper.getStats(), elapsedRealtimeUs, false);
-                    useEnhancedEstimateIfAvailable(getContext(), batteryInfo);
+                    BatteryInfo batteryInfo = getBatteryInfo(elapsedRealtimeUs, batteryBroadcast);
                     updateHeaderPreference(batteryInfo);
                 }
 
@@ -499,12 +498,10 @@
 
         initAnomalyDetectionIfPossible();
 
-        final long elapsedRealtimeUs = SystemClock.elapsedRealtime() * 1000;
+        final long elapsedRealtimeUs = mBatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
         Intent batteryBroadcast = context.registerReceiver(null,
                 new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-        BatteryInfo batteryInfo = BatteryInfo.getBatteryInfo(context, batteryBroadcast,
-                mStatsHelper.getStats(), elapsedRealtimeUs, false);
-        useEnhancedEstimateIfAvailable(context, batteryInfo);
+        BatteryInfo batteryInfo = getBatteryInfo(elapsedRealtimeUs, batteryBroadcast);
         updateHeaderPreference(batteryInfo);
 
         final long runningTime = calculateRunningTimeBasedOnStatsType();
@@ -665,7 +662,7 @@
 
     @VisibleForTesting
     long calculateRunningTimeBasedOnStatsType() {
-        final long elapsedRealtimeUs = SystemClock.elapsedRealtime() * 1000;
+        final long elapsedRealtimeUs = mBatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
         // Return the battery time (millisecond) on status mStatsType
         return mStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs,
                 mStatsType /* STATS_SINCE_CHARGED */) / 1000;
@@ -748,17 +745,20 @@
         }
     }
 
-    @VisibleForTesting
-    void useEnhancedEstimateIfAvailable(Context context, BatteryInfo batteryInfo) {
-        if (mEnhancedEstimate > 0
-                && mPowerFeatureProvider.isEnhancedBatteryPredictionEnabled(context)) {
-            final Resources resources = context.getResources();
-            batteryInfo.remainingTimeUs = mEnhancedEstimate;
-            String timeString = Formatter.formatShortElapsedTime(context, mEnhancedEstimate);
-            batteryInfo.remainingLabel = resources.getString(
-                    com.android.settingslib.R.string.power_remaining_duration_only,
-                    timeString);
+    private BatteryInfo getBatteryInfo(long elapsedRealtimeUs, Intent batteryBroadcast) {
+        BatteryInfo batteryInfo;
+        if (mEnhancedEstimate > 0 &&
+                mPowerFeatureProvider.isEnhancedBatteryPredictionEnabled(
+                        getContext())) {
+            // Drain time is in micro-seconds so we have to multiply by 1000
+            batteryInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast,
+                    mStatsHelper.getStats(), elapsedRealtimeUs, false,
+                    mBatteryUtils.convertMsToUs(mEnhancedEstimate), true);
+        } else {
+            batteryInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast,
+                    mStatsHelper.getStats(), elapsedRealtimeUs, false);
         }
+        return batteryInfo;
     }
 
     private static List<BatterySipper> getFakeStats() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 95e33bb..93bd023 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -490,41 +490,6 @@
     }
 
     @Test
-    public void testUseEnhancedEstimateIfAvailable() {
-        // mock out the provider
-        final long time = 60 * 1000 * 1000;
-        PowerUsageFeatureProvider provider = mFeatureFactory.getPowerUsageFeatureProvider(mContext);
-        when(provider.isEnhancedBatteryPredictionEnabled(any())).thenReturn(true);
-        mFragment.mPowerFeatureProvider = provider;
-        mFragment.mEnhancedEstimate = time;
-
-        mFragment.useEnhancedEstimateIfAvailable(mRealContext, mBatteryInfo);
-
-        // The string that gets returned always has weird whitespacing to make it fit
-        // so we're just going to check that it contains the correct value we care about.
-        assertThat(mBatteryInfo.remainingTimeUs).isEqualTo(time);
-        assertThat(mBatteryInfo.remainingLabel).contains("About 17 hrs");
-    }
-
-    @Test
-    public void testUseEnhancedEstimateIfAvailable_noOpsOnDisabled() {
-        // mock out the provider
-        final long time = 60 * 1000 * 1000;
-        PowerUsageFeatureProvider provider = mFeatureFactory.getPowerUsageFeatureProvider(mContext);
-        when(provider.isEnhancedBatteryPredictionEnabled(any())).thenReturn(false);
-        mFragment.mPowerFeatureProvider = provider;
-        mFragment.mEnhancedEstimate = time;
-        mBatteryInfo.remainingTimeUs = TIME_SINCE_LAST_FULL_CHARGE_US;
-        mBatteryInfo.remainingLabel = TIME_LEFT;
-
-        mFragment.useEnhancedEstimateIfAvailable(mRealContext, mBatteryInfo);
-
-        // check to make sure the values did not change
-        assertThat(mBatteryInfo.remainingTimeUs).isEqualTo(TIME_SINCE_LAST_FULL_CHARGE_US);
-        assertThat(mBatteryInfo.remainingLabel).contains(TIME_LEFT);
-    }
-
-    @Test
     public void testBatteryPredictionLoaderCallbacks_DoesNotCrashOnNull() {
         // Sanity test to check for crash
         mFragment.mBatteryPredictionLoaderCallbacks.onLoadFinished(null, null);
