diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0e7b0b9..e1be177 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5133,6 +5133,9 @@
     <!-- Title for the battery management group [CHAR LIMIT=40] -->
     <string name ="battery_detail_manage_title">Manage battery usage</string>
 
+    <!-- Graph subtext displayed to user when enhanced battery estimate is being used [CHAR LIMIT=120] -->
+    <string name="advanced_battery_graph_subtext">Battery left estimate is based on your device usage</string>
+
     <!-- Description for battery time left, i.e. 50min Estimated time left. [CHAR LIMIT=80]-->
     <string name="estimated_time_left">Estimated time left</string>
 
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index 78e8339..8d6700c 100644
--- a/src/com/android/settings/ResetNetworkConfirm.java
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -225,6 +225,7 @@
             mEraseEsimTask.cancel(true /* mayInterruptIfRunning */);
             mEraseEsimTask = null;
         }
+        super.onDestroy();
     }
 
     @Override
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 01818e9..7328c76 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -82,8 +82,6 @@
 
     // Constants for state save/restore
     private static final String SAVE_KEY_CATEGORIES = ":settings:categories";
-    @VisibleForTesting
-    static final String SAVE_KEY_SHOW_HOME_AS_UP = ":settings:show_home_as_up";
 
     /**
      * When starting this activity, the invoking Intent can contain this extra
@@ -146,12 +144,10 @@
     public static final String EXTRA_HIDE_DRAWER = ":settings:hide_drawer";
 
     public static final String META_DATA_KEY_FRAGMENT_CLASS =
-        "com.android.settings.FRAGMENT_CLASS";
+            "com.android.settings.FRAGMENT_CLASS";
 
     private static final String EXTRA_UI_OPTIONS = "settings:ui_options";
 
-    private static final int REQUEST_SUGGESTION = 42;
-
     private String mFragmentClass;
 
     private CharSequence mInitialTitle;
@@ -183,9 +179,6 @@
 
     private Button mNextButton;
 
-    @VisibleForTesting
-    boolean mDisplayHomeAsUpEnabled;
-
     private boolean mIsShowingDashboard;
     private boolean mIsShortcut;
 
@@ -197,7 +190,6 @@
     private ArrayList<DashboardCategory> mCategories = new ArrayList<>();
 
     private DashboardFeatureProvider mDashboardFeatureProvider;
-    private ComponentName mCurrentSuggestion;
 
     public SwitchBar getSwitchBar() {
         return mSwitchBar;
@@ -310,9 +302,6 @@
                 mCategories.addAll(categories);
                 setTitleFromBackStack();
             }
-
-            mDisplayHomeAsUpEnabled = savedState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP);
-
         } else {
             launchSettingFragment(initialFragmentName, isSubSettings, intent);
         }
@@ -337,8 +326,8 @@
 
         ActionBar actionBar = getActionBar();
         if (actionBar != null) {
-            actionBar.setDisplayHomeAsUpEnabled(mDisplayHomeAsUpEnabled);
-            actionBar.setHomeButtonEnabled(mDisplayHomeAsUpEnabled);
+            actionBar.setDisplayHomeAsUpEnabled(true);
+            actionBar.setHomeButtonEnabled(true);
             actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard);
         }
         mSwitchBar = findViewById(R.id.switch_bar);
@@ -353,21 +342,21 @@
             if (buttonBar != null) {
                 buttonBar.setVisibility(View.VISIBLE);
 
-                Button backButton = (Button)findViewById(R.id.back_button);
+                Button backButton = (Button) findViewById(R.id.back_button);
                 backButton.setOnClickListener(new OnClickListener() {
                     public void onClick(View v) {
                         setResult(RESULT_CANCELED, null);
                         finish();
                     }
                 });
-                Button skipButton = (Button)findViewById(R.id.skip_button);
+                Button skipButton = (Button) findViewById(R.id.skip_button);
                 skipButton.setOnClickListener(new OnClickListener() {
                     public void onClick(View v) {
                         setResult(RESULT_OK, null);
                         finish();
                     }
                 });
-                mNextButton = (Button)findViewById(R.id.next_button);
+                mNextButton = (Button) findViewById(R.id.next_button);
                 mNextButton.setOnClickListener(new OnClickListener() {
                     public void onClick(View v) {
                         setResult(RESULT_OK, null);
@@ -380,8 +369,7 @@
                     String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT);
                     if (TextUtils.isEmpty(buttonText)) {
                         mNextButton.setVisibility(View.GONE);
-                    }
-                    else {
+                    } else {
                         mNextButton.setText(buttonText);
                     }
                 }
@@ -389,8 +377,7 @@
                     String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT);
                     if (TextUtils.isEmpty(buttonText)) {
                         backButton.setVisibility(View.GONE);
-                    }
-                    else {
+                    } else {
                         backButton.setText(buttonText);
                     }
                 }
@@ -408,26 +395,17 @@
     @VisibleForTesting
     void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) {
         if (!mIsShowingDashboard && initialFragmentName != null) {
-            // UP will be shown only if it is a sub settings
-            if (mIsShortcut) {
-                mDisplayHomeAsUpEnabled = isSubSettings;
-            } else if (isSubSettings) {
-                mDisplayHomeAsUpEnabled = true;
-            } else {
-                mDisplayHomeAsUpEnabled = false;
-            }
             setTitleFromIntent(intent);
 
             Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
             switchToFragment(initialFragmentName, initialArguments, true, false,
-                mInitialTitleResId, mInitialTitle, false);
+                    mInitialTitleResId, mInitialTitle, false);
         } else {
             // Show search icon as up affordance if we are displaying the main Dashboard
-            mDisplayHomeAsUpEnabled = true;
             mInitialTitleResId = R.string.dashboard_title;
 
             switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
-                mInitialTitleResId, mInitialTitle, false);
+                    mInitialTitleResId, mInitialTitle, false);
         }
     }
 
@@ -509,15 +487,6 @@
         if (mCategories.size() > 0) {
             outState.putParcelableArrayList(SAVE_KEY_CATEGORIES, mCategories);
         }
-
-        outState.putBoolean(SAVE_KEY_SHOW_HOME_AS_UP, mDisplayHomeAsUpEnabled);
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-
-        mDisplayHomeAsUpEnabled = savedInstanceState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP);
     }
 
     @Override
@@ -610,17 +579,17 @@
      * single-pane mode, a new activity will be launched in which to show the
      * fragment.
      *
-     * @param fragmentClass Full name of the class implementing the fragment.
-     * @param args Any desired arguments to supply to the fragment.
-     * @param titleRes Optional resource identifier of the title of this
-     * fragment.
-     * @param titleText Optional text of the title of this fragment.
-     * @param resultTo Optional fragment that result data should be sent to.
-     * If non-null, resultTo.onActivityResult() will be called when this
-     * preference panel is done.  The launched panel must use
-     * {@link #finishPreferencePanel(Fragment, int, Intent)} when done.
+     * @param fragmentClass     Full name of the class implementing the fragment.
+     * @param args              Any desired arguments to supply to the fragment.
+     * @param titleRes          Optional resource identifier of the title of this
+     *                          fragment.
+     * @param titleText         Optional text of the title of this fragment.
+     * @param resultTo          Optional fragment that result data should be sent to.
+     *                          If non-null, resultTo.onActivityResult() will be called when this
+     *                          preference panel is done.  The launched panel must use
+     *                          {@link #finishPreferencePanel(Fragment, int, Intent)} when done.
      * @param resultRequestCode If resultTo is non-null, this is the caller's
-     * request code to be received with the result.
+     *                          request code to be received with the result.
      */
     public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args,
             int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) {
@@ -639,10 +608,10 @@
      * activity will be launched in which to show the fragment.
      *
      * @param fragmentClass Full name of the class implementing the fragment.
-     * @param args Any desired arguments to supply to the fragment.
-     * @param titleRes Optional resource identifier of the title of this fragment.
-     * @param titleText Optional text of the title of this fragment.
-     * @param userHandle The user for which the panel has to be started.
+     * @param args          Any desired arguments to supply to the fragment.
+     * @param titleRes      Optional resource identifier of the title of this fragment.
+     * @param titleText     Optional text of the title of this fragment.
+     * @param userHandle    The user for which the panel has to be started.
      */
     public void startPreferencePanelAsUser(Fragment caller, String fragmentClass,
             Bundle args, int titleRes, CharSequence titleText, UserHandle userHandle) {
@@ -676,11 +645,11 @@
     /**
      * Called by a preference panel fragment to finish itself.
      *
-     * @param caller The fragment that is asking to be finished.
+     * @param caller     The fragment that is asking to be finished.
      * @param resultCode Optional result code to send back to the original
-     * launching fragment.
+     *                   launching fragment.
      * @param resultData Optional result data to send back to the original
-     * launching fragment.
+     *                   launching fragment.
      */
     public void finishPreferencePanel(Fragment caller, int resultCode, Intent resultData) {
         setResult(resultCode, resultData);
@@ -691,8 +660,8 @@
      * Start a new fragment.
      *
      * @param fragment The fragment to start
-     * @param push If true, the current fragment will be pushed onto the back stack.  If false,
-     * the current fragment will be replaced.
+     * @param push     If true, the current fragment will be pushed onto the back stack.  If false,
+     *                 the current fragment will be replaced.
      */
     public void startPreferenceFragment(Fragment fragment, boolean push) {
         FragmentTransaction transaction = getFragmentManager().beginTransaction();
@@ -940,29 +909,6 @@
         return mNextButton;
     }
 
-    @Override
-    public boolean shouldUpRecreateTask(Intent targetIntent) {
-        return super.shouldUpRecreateTask(new Intent(this, SettingsActivity.class));
-    }
-
-    public void startSuggestion(Intent intent) {
-        if (intent == null || ActivityManager.isUserAMonkey()) {
-            return;
-        }
-        mCurrentSuggestion = intent.getComponent();
-        startActivityForResult(intent, REQUEST_SUGGESTION);
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (requestCode == REQUEST_SUGGESTION && mCurrentSuggestion != null
-                && resultCode != RESULT_CANCELED) {
-            getPackageManager().setComponentEnabledSetting(mCurrentSuggestion,
-                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
-        }
-        super.onActivityResult(requestCode, resultCode, data);
-    }
-
     @VisibleForTesting
     Bitmap getBitmapFromXmlResource(int drawableRes) {
         Drawable drawable = getResources().getDrawable(drawableRes, getTheme());
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index f45ac5e..1a32127 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -52,11 +52,8 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.hardware.fingerprint.FingerprintManager;
-import android.icu.text.MeasureFormat;
 import android.icu.text.RelativeDateTimeFormatter;
 import android.icu.text.RelativeDateTimeFormatter.RelativeUnit;
-import android.icu.util.Measure;
-import android.icu.util.MeasureUnit;
 import android.icu.util.ULocale;
 import android.net.ConnectivityManager;
 import android.net.LinkProperties;
@@ -88,8 +85,6 @@
 import android.telephony.TelephonyManager;
 import android.text.Spannable;
 import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.text.style.TtsSpan;
@@ -112,6 +107,7 @@
 import com.android.settings.wrapper.FingerprintManagerWrapper;
 import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
 
+import com.android.settingslib.utils.StringUtil;
 import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -138,10 +134,6 @@
 
     private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
 
-    private static final int SECONDS_PER_MINUTE = 60;
-    private static final int SECONDS_PER_HOUR = 60 * 60;
-    private static final int SECONDS_PER_DAY = 24 * 60 * 60;
-
     public static final String OS_PKG = "os";
 
     /**
@@ -772,113 +764,6 @@
     }
 
     /**
-     * Returns elapsed time for the given millis, in the following format:
-     * 2d 5h 40m 29s
-     * @param context the application context
-     * @param millis the elapsed time in milli seconds
-     * @param withSeconds include seconds?
-     * @return the formatted elapsed time
-     */
-    public static CharSequence formatElapsedTime(Context context, double millis,
-            boolean withSeconds) {
-        SpannableStringBuilder sb = new SpannableStringBuilder();
-        int seconds = (int) Math.floor(millis / 1000);
-        if (!withSeconds) {
-            // Round up.
-            seconds += 30;
-        }
-
-        int days = 0, hours = 0, minutes = 0;
-        if (seconds >= SECONDS_PER_DAY) {
-            days = seconds / SECONDS_PER_DAY;
-            seconds -= days * SECONDS_PER_DAY;
-        }
-        if (seconds >= SECONDS_PER_HOUR) {
-            hours = seconds / SECONDS_PER_HOUR;
-            seconds -= hours * SECONDS_PER_HOUR;
-        }
-        if (seconds >= SECONDS_PER_MINUTE) {
-            minutes = seconds / SECONDS_PER_MINUTE;
-            seconds -= minutes * SECONDS_PER_MINUTE;
-        }
-
-        final ArrayList<Measure> measureList = new ArrayList(4);
-        if (days > 0) {
-            measureList.add(new Measure(days, MeasureUnit.DAY));
-        }
-        if (hours > 0) {
-            measureList.add(new Measure(hours, MeasureUnit.HOUR));
-        }
-        if (minutes > 0) {
-            measureList.add(new Measure(minutes, MeasureUnit.MINUTE));
-        }
-        if (withSeconds && seconds > 0) {
-            measureList.add(new Measure(seconds, MeasureUnit.SECOND));
-        }
-        if (measureList.size() == 0) {
-            // Everything addable was zero, so nothing was added. We add a zero.
-            measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE));
-        }
-        final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]);
-
-        final Locale locale = context.getResources().getConfiguration().locale;
-        final MeasureFormat measureFormat = MeasureFormat.getInstance(
-                locale, MeasureFormat.FormatWidth.NARROW);
-        sb.append(measureFormat.formatMeasures(measureArray));
-
-        if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) {
-            // Add ttsSpan if it only have minute value, because it will be read as "meters"
-            final TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes)
-                    .setUnit("minute").build();
-            sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-        }
-
-        return sb;
-    }
-
-    /**
-     * Returns relative time for the given millis in the past, in a short format such as "2 days
-     * ago", "5 hr. ago", "40 min. ago", or "29 sec. ago".
-     *
-     * <p>The unit is chosen to have good information value while only using one unit. So 27 hours
-     * and 50 minutes would be formatted as "28 hr. ago", while 50 hours would be formatted as
-     * "2 days ago".
-     *
-     * @param context the application context
-     * @param millis the elapsed time in milli seconds
-     * @param withSeconds include seconds?
-     * @return the formatted elapsed time
-     */
-    public static CharSequence formatRelativeTime(Context context, double millis,
-            boolean withSeconds) {
-        final int seconds = (int) Math.floor(millis / 1000);
-        final RelativeUnit unit;
-        final int value;
-        if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) {
-            unit = RelativeUnit.SECONDS;
-            value = seconds;
-        } else if (seconds < 2 * SECONDS_PER_HOUR) {
-            unit = RelativeUnit.MINUTES;
-            value = (seconds + SECONDS_PER_MINUTE / 2) / SECONDS_PER_MINUTE;
-        } else if (seconds < 2 * SECONDS_PER_DAY) {
-            unit = RelativeUnit.HOURS;
-            value = (seconds + SECONDS_PER_HOUR / 2) / SECONDS_PER_HOUR;
-        } else {
-            unit = RelativeUnit.DAYS;
-            value = (seconds + SECONDS_PER_DAY / 2) / SECONDS_PER_DAY;
-        }
-
-        final Locale locale = context.getResources().getConfiguration().locale;
-        final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance(
-                ULocale.forLocale(locale),
-                null /* default NumberFormat */,
-                RelativeDateTimeFormatter.Style.SHORT,
-                android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE);
-
-        return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit);
-    }
-
-    /**
      * Queries for the UserInfo of a user. Returns null if the user doesn't exist (was removed).
      * @param userManager Instance of UserManager
      * @param checkUser The user to check the existence of.
diff --git a/src/com/android/settings/applications/RecentAppsPreferenceController.java b/src/com/android/settings/applications/RecentAppsPreferenceController.java
index e15671b..b177225 100644
--- a/src/com/android/settings/applications/RecentAppsPreferenceController.java
+++ b/src/com/android/settings/applications/RecentAppsPreferenceController.java
@@ -38,13 +38,13 @@
 import android.util.Log;
 
 import com.android.settings.R;
-import com.android.settings.Utils;
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.widget.AppPreference;
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.StringUtil;
 import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
@@ -239,7 +239,7 @@
             pref.setKey(pkgName);
             pref.setTitle(appEntry.label);
             pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
-            pref.setSummary(Utils.formatRelativeTime(mContext,
+            pref.setSummary(StringUtil.formatRelativeTime(mContext,
                     System.currentTimeMillis() - stat.getLastTimeUsed(), false));
             pref.setOrder(i);
             pref.setOnPreferenceClickListener(preference -> {
diff --git a/src/com/android/settings/backup/BackupSettingsHelper.java b/src/com/android/settings/backup/BackupSettingsHelper.java
index b0d6cf8..d0a029c 100644
--- a/src/com/android/settings/backup/BackupSettingsHelper.java
+++ b/src/com/android/settings/backup/BackupSettingsHelper.java
@@ -24,13 +24,12 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
-import android.util.Log;
-
 import android.support.annotation.VisibleForTesting;
+import android.util.Log;
 
 import com.android.settings.R;
 import com.android.settings.Settings.PrivacySettingsActivity;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
+
 import java.net.URISyntaxException;
 
 /**
@@ -153,8 +152,7 @@
 
     private Intent getIntentForDefaultBackupSettings() {
         // Extra needed by {@link SettingsDrawerActivity} to show the back button navigation.
-        return new Intent(mContext, PrivacySettingsActivity.class)
-                .putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
+        return new Intent(mContext, PrivacySettingsActivity.class);
     }
 
     /**
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 086a131..3ed76d8 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -33,21 +33,18 @@
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
 import android.util.ArrayMap;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
 import com.android.settingslib.drawer.CategoryManager;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.ProfileSelectDialog;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
 import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.drawer.TileUtils;
 import com.android.settingslib.utils.ThreadUtils;
@@ -212,7 +209,6 @@
         final Intent intent = new Intent(tile.intent)
                 .putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
                         MetricsEvent.DASHBOARD_SUMMARY)
-                .putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true)
                 .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
         launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY);
     }
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index efcf03d..2093469 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -236,7 +236,6 @@
                 Intent intent = Utils.onBuildStartFragmentIntent(getActivity(),
                         StorageDashboardFragment.class.getName(), args, null,
                         R.string.storage_settings, null, false, getMetricsCategory());
-                intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
                 getActivity().startActivity(intent);
                 finish();
             }
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index 4870e7e..c9fe54e 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -85,7 +85,6 @@
             Intent intent = Utils.onBuildStartFragmentIntent(mContext,
                     StorageProfileFragment.class.getName(), args, null, 0,
                     mUser.name, false, MetricsProto.MetricsEvent.DEVICEINFO_STORAGE);
-            intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
             mContext.startActivity(intent);
             return true;
         }
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index e073456..981b0dc 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -58,6 +58,7 @@
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
 
+import com.android.settingslib.utils.StringUtil;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -284,10 +285,10 @@
         final int powerMah = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT);
         mForegroundPreference.setSummary(
                 TextUtils.expandTemplate(getText(R.string.battery_used_for),
-                        Utils.formatElapsedTime(context, foregroundTimeMs, false)));
+                        StringUtil.formatElapsedTime(context, foregroundTimeMs, false)));
         mBackgroundPreference.setSummary(
                 TextUtils.expandTemplate(getText(R.string.battery_active_for),
-                        Utils.formatElapsedTime(context, backgroundTimeMs, false)));
+                        StringUtil.formatElapsedTime(context, backgroundTimeMs, false)));
         mPowerUsagePreference.setSummary(
                 getString(R.string.battery_detail_power_percentage, usagePercent, powerMah));
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index 91f35e2..2095f25 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -18,7 +18,6 @@
 package com.android.settings.fuelgauge;
 
 import android.app.Activity;
-import android.app.Fragment;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.os.BatteryStats;
@@ -31,7 +30,6 @@
 import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
-import android.support.v7.preference.PreferenceManager;
 import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
@@ -48,16 +46,14 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.Utils;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnDestroy;
 import com.android.settingslib.core.lifecycle.events.OnPause;
 
+import com.android.settingslib.utils.StringUtil;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -362,8 +358,8 @@
         // Only show summary when usage time is longer than one minute
         final long usageTimeMs = sipper.usageTimeMs;
         if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
-            final CharSequence timeSequence = Utils.formatElapsedTime(mContext, usageTimeMs,
-                    false);
+            final CharSequence timeSequence =
+                StringUtil.formatElapsedTime(mContext, usageTimeMs, false);
             preference.setSummary(
                     (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
                             ? timeSequence
diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java
index 6384130..43465ab 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfo.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfo.java
@@ -25,7 +25,6 @@
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.support.annotation.WorkerThread;
-import android.text.TextUtils;
 import android.text.format.Formatter;
 import android.util.SparseIntArray;
 
@@ -34,8 +33,14 @@
 import com.android.settings.graph.UsageView;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.R;
+import com.android.settingslib.utils.PowerUtil;
+import com.android.settingslib.utils.StringUtil;
+import java.util.concurrent.TimeUnit;
 
 public class BatteryInfo {
+    private static final long SEVEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(7);
+    private static final long FIFTEEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(15);
+    private static final long ONE_DAY_MICROS = TimeUnit.DAYS.toMicros(1);
 
     public CharSequence chargeLabel;
     public CharSequence remainingLabel;
@@ -100,7 +105,7 @@
                         if (lastTime >= 0) {
                             points.put(lastTime, lastLevel);
                             points.put((int) (timePeriod +
-                                            BatteryUtils.convertUsToMs(remainingTimeUs)),
+                                            PowerUtil.convertUsToMs(remainingTimeUs)),
                                     mCharging ? 100 : 0);
                         }
                     }
@@ -160,7 +165,7 @@
                 PowerUsageFeatureProvider provider =
                         FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
                 final long elapsedRealtimeUs =
-                        BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
+                        PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
 
                 Intent batteryBroadcast = context.registerReceiver(null,
                         new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
@@ -176,7 +181,7 @@
                                 .logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime);
                         return BatteryInfo.getBatteryInfo(context, batteryBroadcast, stats,
                                 elapsedRealtimeUs, shortString,
-                                BatteryUtils.convertMsToUs(estimate.estimateMillis),
+                                PowerUtil.convertMsToUs(estimate.estimateMillis),
                                 estimate.isBasedOnUsage);
                     }
                 }
@@ -217,53 +222,61 @@
 
         info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast);
         if (!info.mCharging) {
-            if (drainTimeUs > 0) {
-                info.remainingTimeUs = drainTimeUs;
-                CharSequence timeString = Utils.formatElapsedTime(context,
-                        BatteryUtils.convertUsToMs(drainTimeUs), false /* withSeconds */);
-                info.remainingLabel = TextUtils.expandTemplate(context.getText(shortString ?
-                                R.string.power_remaining_duration_only_short :
-                         (basedOnUsage ?
-                                R.string.power_remaining_duration_only_enhanced :
-                                R.string.power_remaining_duration_only)), timeString);
-                info.chargeLabel = TextUtils.expandTemplate(context.getText(
-                        shortString ?
-                                R.string.power_discharging_duration_short :
-                                basedOnUsage ?
-                                        R.string.power_discharging_duration_enhanced :
-                                        R.string.power_discharging_duration),
-                        info.batteryPercentString, timeString);
-            } else {
-                info.remainingLabel = null;
-                info.chargeLabel = info.batteryPercentString;
-            }
+            updateBatteryInfoDischarging(context, shortString, drainTimeUs, basedOnUsage, info);
         } else {
-            final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
-            final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
-                    BatteryManager.BATTERY_STATUS_UNKNOWN);
-            info.discharging = false;
-            if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
-                info.remainingTimeUs = chargeTime;
-                CharSequence timeString = Utils.formatElapsedTime(context,
-                        BatteryUtils.convertUsToMs(chargeTime), false /* withSeconds */);
-                int resId = R.string.power_charging_duration;
-                info.remainingLabel = TextUtils.expandTemplate(context.getText(
-                        R.string.power_remaining_charging_duration_only), timeString);
-                info.chargeLabel = TextUtils.expandTemplate(context.getText(resId),
-                        info.batteryPercentString, timeString);
-            } else {
-                final String chargeStatusLabel = resources.getString(
-                        R.string.battery_info_status_charging_lower);
-                info.remainingLabel = null;
-                info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString :
-                        resources.getString(R.string.power_charging, info.batteryPercentString,
-                                chargeStatusLabel);
-            }
+            updateBatteryInfoCharging(context, batteryBroadcast, stats, elapsedRealtimeUs, info);
         }
         BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime);
         return info;
     }
 
+    private static void updateBatteryInfoCharging(Context context, Intent batteryBroadcast,
+            BatteryStats stats, long elapsedRealtimeUs, BatteryInfo info) {
+        final Resources resources = context.getResources();
+        final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
+        final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
+                BatteryManager.BATTERY_STATUS_UNKNOWN);
+        info.discharging = false;
+        if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
+            info.remainingTimeUs = chargeTime;
+            CharSequence timeString = StringUtil.formatElapsedTime(context,
+                    PowerUtil.convertUsToMs(info.remainingTimeUs), false /* withSeconds */);
+            int resId = R.string.power_charging_duration;
+            info.remainingLabel = context.getString(
+                    R.string.power_remaining_charging_duration_only, timeString);
+            info.chargeLabel = context.getString(resId, info.batteryPercentString, timeString);
+        } else {
+            final String chargeStatusLabel = resources.getString(
+                    R.string.battery_info_status_charging_lower);
+            info.remainingLabel = null;
+            info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString :
+                    resources.getString(R.string.power_charging, info.batteryPercentString,
+                            chargeStatusLabel);
+        }
+    }
+
+    private static void updateBatteryInfoDischarging(Context context, boolean shortString,
+            long drainTimeUs, boolean basedOnUsage, BatteryInfo info) {
+        if (drainTimeUs > 0) {
+            info.remainingTimeUs = drainTimeUs;
+            info.remainingLabel = PowerUtil.getBatteryRemainingStringFormatted(
+                    context,
+                    PowerUtil.convertUsToMs(drainTimeUs),
+                    null /* percentageString */,
+                    basedOnUsage && !shortString
+            );
+            info.chargeLabel = PowerUtil.getBatteryRemainingStringFormatted(
+                    context,
+                    PowerUtil.convertUsToMs(drainTimeUs),
+                    info.batteryPercentString,
+                    basedOnUsage && !shortString
+            );
+        } else {
+            info.remainingLabel = null;
+            info.chargeLabel = info.batteryPercentString;
+        }
+    }
+
     public interface BatteryDataParser {
         void onParsingStarted(long startTime, long endTime);
 
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 5738c29..da9b705 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -43,6 +43,7 @@
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.overlay.FeatureFactory;
 
+import com.android.settingslib.utils.PowerUtil;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Collections;
@@ -68,19 +69,18 @@
         int BACKGROUND = 2;
         int ALL = 3;
     }
-
     private static final String TAG = "BatteryUtils";
 
     private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5;
+
     private static final int SECONDS_IN_HOUR = 60 * 60;
     private static BatteryUtils sInstance;
-
     private PackageManager mPackageManager;
+
     private AppOpsManager mAppOpsManager;
     private Context mContext;
     @VisibleForTesting
     PowerUsageFeatureProvider mPowerUsageFeatureProvider;
-
     public static BatteryUtils getInstance(Context context) {
         if (sInstance == null || sInstance.isDataCorrupted()) {
             sInstance = new BatteryUtils(context);
@@ -131,29 +131,30 @@
 
         // Return the min value of STATE_TOP time and foreground activity time, since both of these
         // time have some errors
-        return convertUsToMs(
+        return PowerUtil.convertUsToMs(
                 Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs)));
     }
 
     private long getScreenUsageTimeMs(BatteryStats.Uid uid, int which) {
-        final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+        final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
         return getScreenUsageTimeMs(uid, which, rawRealTimeUs);
     }
 
     private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
-        final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+        final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
         final long timeUs = uid.getProcessStateTime(
                 BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
 
         Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
         Log.v(TAG, "background time(us): " + timeUs);
-        return convertUsToMs(timeUs);
+        return PowerUtil.convertUsToMs(timeUs);
     }
 
     private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
-        final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+        final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
         return getScreenUsageTimeMs(uid, which, rawRealTimeUs)
-                + convertUsToMs(getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
+                + PowerUtil.convertUsToMs(
+                        getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
     }
 
     /**
@@ -267,9 +268,10 @@
      */
     public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper,
             int statsType) {
-        final long elapsedRealtimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+        final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
+                SystemClock.elapsedRealtime());
         // Return the battery time (millisecond) on status mStatsType
-        return convertUsToMs(
+        return PowerUtil.convertUsToMs(
                 batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType));
 
     }
@@ -390,25 +392,15 @@
         }
     }
 
-    public static long convertUsToMs(long timeUs) {
-        return timeUs / 1000;
-    }
-
-    public static long convertMsToUs(long timeMs) {
-        return timeMs * 1000;
-    }
-
     public void setForceAppStandby(int uid, String packageName,
             int mode) {
         final boolean isPreOApp = isLegacyApp(packageName);
         if (isPreOApp) {
             // Control whether app could run in the background if it is pre O app
-            mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName,
-                    mode);
+            mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, mode);
         }
         // Control whether app could run jobs in the background
-        mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName,
-                mode);
+        mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode);
     }
 
     public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
@@ -425,7 +417,8 @@
         // Stuff we always need to get BatteryInfo
         final Intent batteryBroadcast = mContext.registerReceiver(null,
                 new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-        final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
+        final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
+                SystemClock.elapsedRealtime());
         BatteryInfo batteryInfo;
 
         // 0 means we are discharging, anything else means charging
@@ -443,7 +436,7 @@
         if (estimate != null) {
             batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
                     elapsedRealtimeUs, false /* shortString */,
-                    BatteryUtils.convertMsToUs(estimate.estimateMillis),
+                    PowerUtil.convertMsToUs(estimate.estimateMillis),
                     estimate.isBasedOnUsage);
         } else {
             batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
diff --git a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
index e58ccd3..509f967 100644
--- a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
+++ b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
@@ -22,6 +22,7 @@
 import android.os.SystemClock;
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.utils.PowerUtil;
 import com.android.settingslib.utils.AsyncLoader;
 import java.util.ArrayList;
 import java.util.List;
@@ -46,7 +47,8 @@
                 FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
 
         // get stuff we'll need for both BatteryInfo
-        final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
+        final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
+                SystemClock.elapsedRealtime());
         Intent batteryBroadcast = getContext().registerReceiver(null,
                 new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
         BatteryStats stats = mStatsHelper.getStats();
@@ -60,7 +62,7 @@
         }
         BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats,
                 elapsedRealtimeUs, false,
-                BatteryUtils.convertMsToUs(estimate.estimateMillis),
+                PowerUtil.convertMsToUs(estimate.estimateMillis),
                 estimate.isBasedOnUsage);
 
         List<BatteryInfo> infos = new ArrayList<>();
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index 6ed92a7..25351d3 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -47,6 +47,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
 
+import com.android.settingslib.utils.StringUtil;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -318,7 +319,7 @@
             return;
         }
         if (usageData.usageList.size() <= 1) {
-            CharSequence timeSequence = Utils.formatElapsedTime(getContext(),
+            CharSequence timeSequence = StringUtil.formatElapsedTime(getContext(),
                     usageData.totalUsageTimeMs, false);
             usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence
                     : TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence);
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 74dc986..3583b14 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -37,10 +37,7 @@
 import android.view.View.OnLongClickListener;
 import android.widget.TextView;
 
-import com.android.internal.hardware.AmbientDisplayConfiguration;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatterySipper.DrainType;
 import com.android.settings.R;
 import com.android.settings.Settings.HighPowerApplicationsActivity;
 import com.android.settings.SettingsActivity;
@@ -48,10 +45,7 @@
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.display.AmbientDisplayPreferenceController;
-import com.android.settings.display.AutoBrightnessPreferenceController;
 import com.android.settings.display.BatteryPercentagePreferenceController;
-import com.android.settings.display.TimeoutPreferenceController;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
 import com.android.settings.fuelgauge.batterytip.BatteryTipLoader;
@@ -63,6 +57,8 @@
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
+import com.android.settingslib.utils.PowerUtil;
+import com.android.settingslib.utils.StringUtil;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -164,12 +160,12 @@
                     // be unplugged for a period of time before being willing ot make an estimate.
                     summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
                             Formatter.formatShortElapsedTime(getContext(),
-                                    BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs))));
+                                    PowerUtil.convertUsToMs(oldInfo.remainingTimeUs))));
 
                     // for this one we can just set the string directly
                     summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
                             Formatter.formatShortElapsedTime(getContext(),
-                                    BatteryUtils.convertUsToMs(newInfo.remainingTimeUs))));
+                                    PowerUtil.convertUsToMs(newInfo.remainingTimeUs))));
 
                     batteryView.setBatteryLevel(oldInfo.batteryLevel);
                     batteryView.setCharging(!oldInfo.discharging);
@@ -314,10 +310,10 @@
         final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime(mStatsHelper,
                 System.currentTimeMillis());
         updateLastFullChargePreference(lastFullChargeTime);
-        mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(),
+        mScreenUsagePref.setSubtitle(StringUtil.formatElapsedTime(getContext(),
                 mBatteryUtils.calculateScreenUsageTime(mStatsHelper), false));
 
-        final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime,
+        final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime,
                 false);
         mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper,
                 false /* showAllApps */, timeSequence);
@@ -340,7 +336,7 @@
 
     @VisibleForTesting
     void updateLastFullChargePreference(long timeMs) {
-        final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false);
+        final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
         mLastFullChargePref.setSubtitle(timeSequence);
     }
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index 605591d..e6c4923 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -69,6 +69,8 @@
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
 
+import com.android.settingslib.utils.PowerUtil;
+import com.android.settingslib.utils.StringUtil;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -210,12 +212,12 @@
                     // be unplugged for a period of time before being willing ot make an estimate.
                     summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
                             Formatter.formatShortElapsedTime(getContext(),
-                                    BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs))));
+                                    PowerUtil.convertUsToMs(oldInfo.remainingTimeUs))));
 
                     // for this one we can just set the string directly
                     summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
                             Formatter.formatShortElapsedTime(getContext(),
-                                    BatteryUtils.convertUsToMs(newInfo.remainingTimeUs))));
+                                    PowerUtil.convertUsToMs(newInfo.remainingTimeUs))));
 
                     batteryView.setBatteryLevel(oldInfo.batteryLevel);
                     batteryView.setCharging(!oldInfo.discharging);
@@ -524,7 +526,7 @@
         updateScreenPreference();
         updateLastFullChargePreference(lastFullChargeTime);
 
-        final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime,
+        final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime,
                 false);
         final int resId = mShowAllApps ? R.string.power_usage_list_summary_device
                 : R.string.power_usage_list_summary;
@@ -653,12 +655,13 @@
                 mStatsHelper.getUsageList(), DrainType.SCREEN);
         final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0;
 
-        mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), usageTimeMs, false));
+        mScreenUsagePref.setSubtitle(
+            StringUtil.formatElapsedTime(getContext(), usageTimeMs, false));
     }
 
     @VisibleForTesting
     void updateLastFullChargePreference(long timeMs) {
-        final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false);
+        final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
         mLastFullChargePref.setSubtitle(timeSequence);
     }
 
@@ -685,8 +688,8 @@
         // Only show summary when usage time is longer than one minute
         final long usageTimeMs = sipper.usageTimeMs;
         if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
-            final CharSequence timeSequence = Utils.formatElapsedTime(getContext(), usageTimeMs,
-                    false);
+            final CharSequence timeSequence =
+                    StringUtil.formatElapsedTime(getContext(), usageTimeMs, false);
             preference.setSummary(
                     (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
                             ? timeSequence
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
index 66ce3ca..d93b589 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
@@ -36,6 +36,7 @@
 import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
 import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
 import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
+import com.android.settingslib.utils.StringUtil;
 
 import java.util.List;
 
@@ -83,7 +84,8 @@
 
                 return new AlertDialog.Builder(context)
                         .setMessage(getString(R.string.battery_tip_dialog_message,
-                                Utils.formatElapsedTime(context, highUsageTip.getScreenTimeMs(),
+                                StringUtil.formatElapsedTime(
+                                        context, highUsageTip.getScreenTimeMs(),
                                         false /* withSeconds */)))
                         .setView(view)
                         .setPositiveButton(android.R.string.ok, null)
diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
index 6c129d8..d982280 100644
--- a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
+++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
@@ -30,6 +30,7 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 
+import com.android.settingslib.utils.StringUtil;
 import java.util.List;
 
 /**
@@ -78,7 +79,7 @@
                         UserHandle.myUserId()));
         holder.appName.setText(Utils.getApplicationLabel(mContext, app.packageName));
         if (app.screenOnTimeMs != 0) {
-            holder.appTime.setText(Utils.formatElapsedTime(mContext, app.screenOnTimeMs, false));
+            holder.appTime.setText(StringUtil.formatElapsedTime(mContext, app.screenOnTimeMs, false));
         }
     }
 
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
index 2aabf98..6091131 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
@@ -22,9 +22,9 @@
 import android.support.annotation.VisibleForTesting;
 
 import com.android.settings.R;
-import com.android.settings.Utils;
 import com.android.settings.fuelgauge.batterytip.AppInfo;
 
+import com.android.settingslib.utils.StringUtil;
 import java.util.List;
 
 /**
@@ -65,7 +65,7 @@
     @Override
     public CharSequence getSummary(Context context) {
         return context.getString(R.string.battery_tip_high_usage_summary,
-                Utils.formatElapsedTime(context, mScreenTimeMs, false));
+                StringUtil.formatElapsedTime(context, mScreenTimeMs, false));
     }
 
     @Override
diff --git a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
index 279dcd3..ce5e1d1 100644
--- a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
+++ b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
@@ -46,6 +46,7 @@
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.StringUtil;
 import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
@@ -229,7 +230,7 @@
             pref.setKey(pkgName);
             pref.setTitle(appEntry.label);
             pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
-            pref.setSummary(Utils.formatRelativeTime(mContext,
+            pref.setSummary(StringUtil.formatRelativeTime(mContext,
                     System.currentTimeMillis() - app.getLastNotified(), false));
             pref.setOrder(i);
             Bundle args = new Bundle();
diff --git a/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java b/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java
index 1970195..5e8ad2c 100644
--- a/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java
+++ b/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java
@@ -17,6 +17,7 @@
 
 import android.app.Fragment;
 import android.content.Context;
+import android.os.UserHandle;
 
 import com.android.settings.Utils;
 
@@ -34,4 +35,10 @@
     public String getPreferenceKey() {
         return KEY_AUTO_SYNC_WORK_ACCOUNT;
     }
+
+    @Override
+    public boolean isAvailable() {
+        return mUserHandle != null && !mUserManager.isManagedProfile() && !mUserManager.isLinkedUser()
+                && mUserManager.getProfiles(UserHandle.myUserId()).size() > 1;
+    }
 }
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index ce0ff80..e392b1f 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -109,6 +109,10 @@
     private static final String PREF_KEY_CONFIGURE_WIFI_SETTINGS = "configure_settings";
     private static final String PREF_KEY_SAVED_NETWORKS = "saved_networks";
 
+    private static boolean isVerboseLoggingEnabled() {
+        return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
+    }
+
     private final Runnable mUpdateAccessPointsRunnable = () -> {
         updateAccessPointPreferences();
     };
@@ -371,7 +375,7 @@
         }
         setProgressBarVisible(true);
         mWifiTracker.forceUpdate();
-        if (WifiTracker.sVerboseLogging) {
+        if (isVerboseLoggingEnabled()) {
             Log.i(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints());
         }
         getView().removeCallbacks(mUpdateAccessPointsRunnable);
@@ -762,7 +766,7 @@
         }
         // AccessPoints are sorted by the WifiTracker
         final List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
-        if (WifiTracker.sVerboseLogging) {
+        if (isVerboseLoggingEnabled()) {
             Log.i(TAG, "updateAccessPoints called for: " + accessPoints);
         }
 
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index 509ecda..25abd4d 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -16,7 +16,6 @@
 
 package com.android.settings;
 
-import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.doReturn;
@@ -28,17 +27,14 @@
 import android.app.ActivityManager;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
-import android.os.Bundle;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
@@ -48,9 +44,6 @@
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SettingsActivityTest {
 
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-
     @Mock
     private FragmentManager mFragmentManager;
     @Mock
@@ -84,13 +77,4 @@
 
         verify(mTaskDescription).setIcon(nullable(Bitmap.class));
     }
-
-    @Test
-    public void testSaveState_EnabledHomeSaved() {
-        mActivity.mDisplayHomeAsUpEnabled = true;
-        Bundle bundle = new Bundle();
-        mActivity.saveState(bundle);
-
-        assertThat((boolean) bundle.get(SettingsActivity.SAVE_KEY_SHOW_HOME_AS_UP)).isTrue();
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java
index fb571bb..d1c4a55 100644
--- a/tests/robotests/src/com/android/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package com.android.settings;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -25,9 +41,7 @@
 import android.os.storage.DiskInfo;
 import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
-import android.text.SpannableStringBuilder;
 import android.text.format.DateUtils;
-import android.text.style.TtsSpan;
 import android.util.IconDrawableFactory;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -35,6 +49,7 @@
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 
+import com.android.settingslib.utils.StringUtil;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -110,175 +125,6 @@
     }
 
     @Test
-    public void testFormatElapsedTime_WithSeconds_ShowSeconds() {
-        final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
-        final String expectedTime = "5m 30s";
-
-        assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatElapsedTime_NoSeconds_DoNotShowSeconds() {
-        final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
-        final String expectedTime = "6m";
-
-        assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatElapsedTime_TimeMoreThanOneDay_ShowCorrectly() {
-        final double testMillis = 2 * DateUtils.DAY_IN_MILLIS
-                + 4 * DateUtils.HOUR_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
-        final String expectedTime = "2d 4h 15m";
-
-        assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatElapsedTime_ZeroFieldsInTheMiddleDontShow() {
-        final double testMillis = 2 * DateUtils.DAY_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
-        final String expectedTime = "2d 15m";
-
-        assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatElapsedTime_FormatZero_WithSeconds() {
-        final double testMillis = 0;
-        final String expectedTime = "0s";
-
-        assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatElapsedTime_FormatZero_NoSeconds() {
-        final double testMillis = 0;
-        final String expectedTime = "0m";
-
-        assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatElapsedTime_onlyContainsMinute_hasTtsSpan() {
-        final double testMillis = 15 * DateUtils.MINUTE_IN_MILLIS;
-
-        final CharSequence charSequence = Utils.formatElapsedTime(mContext, testMillis, false);
-        assertThat(charSequence).isInstanceOf(SpannableStringBuilder.class);
-
-        final SpannableStringBuilder expectedString = (SpannableStringBuilder) charSequence;
-        final TtsSpan[] ttsSpans = expectedString.getSpans(0, expectedString.length(),
-                TtsSpan.class);
-
-        assertThat(ttsSpans).asList().hasSize(1);
-        assertThat(ttsSpans[0].getType()).isEqualTo(TtsSpan.TYPE_MEASURE);
-    }
-
-    @Test
-    public void testFormatRelativeTime_WithSeconds_ShowSeconds() {
-        final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
-        final String expectedTime = "40 sec. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_NoSeconds_DoNotShowSeconds() {
-        final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
-        final String expectedTime = "1 min. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_LessThanTwoMinutes_withSeconds() {
-        final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
-        final String expectedTime = "119 sec. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_LessThanTwoMinutes_NoSeconds() {
-        final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
-        final String expectedTime = "2 min. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_TwoMinutes_withSeconds() {
-        final double testMillis = 2 * DateUtils.MINUTE_IN_MILLIS;
-        final String expectedTime = "2 min. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_LessThanTwoHours_withSeconds() {
-        final double testMillis = 119 * DateUtils.MINUTE_IN_MILLIS;
-        final String expectedTime = "119 min. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_TwoHours_withSeconds() {
-        final double testMillis = 2 * DateUtils.HOUR_IN_MILLIS;
-        final String expectedTime = "2 hr. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_LessThanTwoDays_withSeconds() {
-        final double testMillis = 47 * DateUtils.HOUR_IN_MILLIS;
-        final String expectedTime = "47 hr. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_TwoDays_withSeconds() {
-        final double testMillis = 2 * DateUtils.DAY_IN_MILLIS;
-        final String expectedTime = "2 days ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_FormatZero_WithSeconds() {
-        final double testMillis = 0;
-        final String expectedTime = "0 sec. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
-    public void testFormatRelativeTime_FormatZero_NoSeconds() {
-        final double testMillis = 0;
-        final String expectedTime = "0 min. ago";
-
-        assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
-                expectedTime);
-    }
-
-    @Test
     public void testInitializeVolumeDoesntBreakOnNullVolume() {
         VolumeInfo info = new VolumeInfo("id", 0, new DiskInfo("id", 0), "");
         StorageManager storageManager = mock(StorageManager.class, RETURNS_DEEP_STUBS);
diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
index 9de0c6a..4e5428c 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
@@ -16,6 +16,14 @@
 
 package com.android.settings.backup;
 
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.app.backup.BackupManager;
 import android.app.backup.IBackupManager;
 import android.content.ComponentName;
@@ -26,6 +34,10 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -36,19 +48,6 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
         shadows = {BackupSettingsHelperTest.ShadowBackupManagerStub.class})
@@ -263,8 +262,6 @@
 
         assertThat(backupIntent.getComponent().getClassName()).isEqualTo(
                 DEFAULT_SETTINGS_CLASSNAME);
-        assertThat(backupIntent.getExtras().getBoolean(
-                SettingsDrawerActivity.EXTRA_SHOW_MENU)).isTrue();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
index 70958a9..45edb47 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
@@ -43,6 +43,9 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
+import com.android.settingslib.R;
+import com.android.settingslib.utils.PowerUtil;
+import java.time.Duration;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -72,6 +75,8 @@
     public static final long TEST_CHARGE_TIME_REMAINING = TimeUnit.MINUTES.toMicros(1);
     public static final String TEST_CHARGE_TIME_REMAINING_STRINGIFIED =
             "1m left until fully charged";
+    public static final String TEST_BATTERY_LEVEL_10 = "10%";
+    public static final String FIFTEEN_MIN_FORMATTED = "15m";
     private Intent mDisChargingBatteryBroadcast;
     private Intent mChargingBatteryBroadcast;
     private Context mContext;
@@ -134,13 +139,15 @@
     }
 
     @Test
-    public void testGetBatteryInfo_basedOnUsageTrue_usesCorrectString() {
+    public void testGetBatteryInfo_basedOnUsageTrueMoreThanFifteenMinutes_usesCorrectString() {
         BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
                 mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
-                1000, true /* basedOnUsage */);
+                PowerUtil.convertMsToUs(Duration.ofHours(4).toMillis()),
+                true /* basedOnUsage */);
         BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
                 mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
-                1000, true /* basedOnUsage */);
+                PowerUtil.convertMsToUs(Duration.ofHours(4).toMillis()),
+                true /* basedOnUsage */);
 
         // We only add special mention for the long string
         assertThat(info.remainingLabel.toString()).contains(ENHANCED_STRING_SUFFIX);
@@ -149,6 +156,41 @@
     }
 
     @Test
+    public void testGetBatteryInfo_basedOnUsageTrueLessThanSevenMinutes_usesCorrectString() {
+        BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
+                PowerUtil.convertMsToUs(Duration.ofMinutes(7).toMillis()),
+                true /* basedOnUsage */);
+        BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
+                PowerUtil.convertMsToUs(Duration.ofMinutes(7).toMillis()),
+                true /* basedOnUsage */);
+
+        // These should be identical in either case
+        assertThat(info.remainingLabel.toString()).isEqualTo(
+                mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent));
+        assertThat(info2.remainingLabel.toString()).isEqualTo(
+                mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent));
+    }
+
+    @Test
+    public void testGetBatteryInfo_basedOnUsageTrueBetweenSevenAndFifteenMinutes_usesCorrectString() {
+        BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
+                PowerUtil.convertMsToUs(Duration.ofMinutes(10).toMillis()),
+                true /* basedOnUsage */);
+
+        // Check that strings are showing less than 15 minutes remaining regardless of exact time.
+        assertThat(info.chargeLabel.toString()).isEqualTo(
+                mContext.getString(R.string.power_remaining_less_than_duration,
+                        TEST_BATTERY_LEVEL_10, FIFTEEN_MIN_FORMATTED));
+        assertThat(info.remainingLabel.toString()).isEqualTo(
+                mContext.getString(R.string.power_remaining_less_than_duration_only,
+                        FIFTEEN_MIN_FORMATTED));
+    }
+
+
+    @Test
     public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() {
         BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
                 mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
index e707ede..a3786c2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
@@ -55,7 +55,6 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.TestConfig;
-import com.android.settings.Utils;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
@@ -65,6 +64,7 @@
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settingslib.core.AbstractPreferenceController;
 
+import com.android.settingslib.utils.StringUtil;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -367,8 +367,8 @@
     public void testUpdateScreenPreference_showCorrectSummary() {
         doReturn(mScreenBatterySipper).when(mFragment).findBatterySipperByType(any(), any());
         doReturn(mRealContext).when(mFragment).getContext();
-        final CharSequence expectedSummary = Utils.formatElapsedTime(mRealContext, USAGE_TIME_MS,
-                false);
+        final CharSequence expectedSummary =
+            StringUtil.formatElapsedTime(mRealContext, USAGE_TIME_MS, false);
 
         mFragment.updateScreenPreference();
 
diff --git a/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java
index 19f3732..22dae37 100644
--- a/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java
@@ -92,6 +92,21 @@
     }
 
     @Test
+    public void checkIsAvailable_null_workProfileUserHandle_shouldNotDisplay() {
+        when(mUserManager.isManagedProfile()).thenReturn(false);
+        when(mUserManager.isLinkedUser()).thenReturn(false);
+
+        final List<UserInfo> infos = new ArrayList<>();
+        infos.add(new UserInfo(UserHandle.USER_SYSTEM, "user 1", 0 /* flags */));
+        infos.add(new UserInfo(999, "xspace", 800010));
+        when(mUserManager.getProfiles(eq(UserHandle.USER_SYSTEM))).thenReturn(infos);
+        mController = new AutoSyncWorkDataPreferenceController(mContext, mFragment);
+
+        assertThat(mController.mUserHandle).isEqualTo(null);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
     public void multipleProfile_shouldInitWithWorkProfileUserHandle() {
         when(mUserManager.isManagedProfile()).thenReturn(false);
         when(mUserManager.isLinkedUser()).thenReturn(false);
