diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index c29453f..86e3b16 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -60,11 +60,11 @@
     <Preference
         android:key="encryption_and_credential"
         android:title="@string/encryption_and_credential_settings_title"
+        android:summary="@string/encryption_and_credential_settings_summary"/>
         android:fragment="com.android.settings.EncryptionAndCredential"/>
 
     <Preference android:key="manage_trust_agents"
         android:title="@string/manage_trust_agents"
-        android:summary="@string/manage_trust_agents_summary"
         android:persistent="false"
         android:fragment="com.android.settings.TrustAgentSettings"/>
 
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index b7d2a73..a56889d 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -40,7 +40,6 @@
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v7.preference.Preference.OnPreferenceClickListener;
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
 import android.telephony.CarrierConfigManager;
@@ -65,7 +64,6 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
-import com.android.settings.search2.SearchFeatureProvider;
 import com.android.settings.security.OwnerInfoPreferenceController;
 import com.android.settings.security.SecurityFeatureProvider;
 import com.android.settings.trustagent.TrustAgentManager;
@@ -102,7 +100,8 @@
     private static final String KEY_UNLOCK_SET_OR_CHANGE_PROFILE = "unlock_set_or_change_profile";
     private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile";
     private static final String KEY_SECURITY_CATEGORY = "security_category";
-    private static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
+    @VisibleForTesting
+    static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
     private static final String KEY_UNIFICATION = "unification";
 
     private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
@@ -312,11 +311,12 @@
         mIsAdmin = mUm.isAdminUser();
 
         // Fingerprint and trust agents
+        int numberOfTrustAgent = 0;
         PreferenceGroup securityCategory = (PreferenceGroup)
                 root.findPreference(KEY_SECURITY_CATEGORY);
         if (securityCategory != null) {
             maybeAddFingerprintPreference(securityCategory, UserHandle.myUserId());
-            addTrustAgentSettings(securityCategory);
+            numberOfTrustAgent = addTrustAgentSettings(securityCategory);
         }
 
         mVisiblePatternProfile =
@@ -351,11 +351,7 @@
         final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
 
         // Advanced Security features
-        Preference manageAgents = root.findPreference(KEY_MANAGE_TRUST_AGENTS);
-        if (manageAgents != null && !mLockPatternUtils.isSecure(MY_USER_ID)) {
-            manageAgents.setEnabled(false);
-            manageAgents.setSummary(R.string.disabled_because_no_backup_security);
-        }
+        initTrustAgentPreference(root, numberOfTrustAgent);
 
         // The above preferences come and go based on security state, so we need to update
         // the index. This call is expected to be fairly cheap, but we may want to do something
@@ -410,6 +406,23 @@
         return root;
     }
 
+    @VisibleForTesting
+    void initTrustAgentPreference(PreferenceScreen root, int numberOfTrustAgent) {
+        Preference manageAgents = root.findPreference(KEY_MANAGE_TRUST_AGENTS);
+        if (manageAgents != null) {
+            if (!mLockPatternUtils.isSecure(MY_USER_ID)) {
+                manageAgents.setEnabled(false);
+                manageAgents.setSummary(R.string.disabled_because_no_backup_security);
+            } else if (numberOfTrustAgent > 0) {
+                manageAgents.setSummary(getActivity().getResources().getQuantityString(
+                    R.plurals.manage_trust_agents_summary_on,
+                    numberOfTrustAgent, numberOfTrustAgent));
+            } else {
+                manageAgents.setSummary(R.string.manage_trust_agents_summary);
+            }
+        }
+    }
+
     /*
      * Sets the preference as disabled by admin if PASSWORD_QUALITY_MANAGED is set.
      * The preference must be a RestrictedPreference.
@@ -434,7 +447,8 @@
         }
     }
 
-    private void addTrustAgentSettings(PreferenceGroup securityCategory) {
+    // Return the number of trust agents being added
+    private int addTrustAgentSettings(PreferenceGroup securityCategory) {
         final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID);
         ArrayList<TrustAgentComponentInfo> agents = getActiveTrustAgents(
             getActivity(), mTrustAgentManager, mLockPatternUtils, mDPM);
@@ -459,6 +473,7 @@
                 trustAgentPreference.setSummary(R.string.disabled_because_no_backup_security);
             }
         }
+        return agents.size();
     }
 
     /* Return true if a there is a Slot that has Icc.
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index e59f94b..caa9da1 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -15,9 +15,11 @@
  */
 package com.android.settings.applications;
 
+import android.app.Activity;
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import android.text.TextUtils;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
@@ -29,6 +31,7 @@
 import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
@@ -78,4 +81,55 @@
                     return Arrays.asList(sir);
                 }
             };
+
+    static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+        private final DefaultSmsPreferenceController mDefaultSmsPreferenceController;
+        private final DefaultBrowserPreferenceController mDefaultBrowserPreferenceController;
+        private final DefaultPhonePreferenceController mDefaultPhonePreferenceController;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+            mDefaultSmsPreferenceController = new DefaultSmsPreferenceController(mContext);
+            mDefaultBrowserPreferenceController = new DefaultBrowserPreferenceController(mContext);
+            mDefaultPhonePreferenceController = new DefaultPhonePreferenceController(mContext);
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (!listening) {
+                return;
+            }
+            CharSequence summary = concatSummaryText(
+                mDefaultSmsPreferenceController.getDefaultAppLabel(),
+                mDefaultBrowserPreferenceController.getDefaultAppLabel());
+            summary = concatSummaryText(summary,
+                mDefaultPhonePreferenceController.getDefaultAppLabel());
+            if (!TextUtils.isEmpty(summary)) {
+                mSummaryLoader.setSummary(this, summary);
+            }
+        }
+
+        private CharSequence concatSummaryText(CharSequence summary1, CharSequence summary2) {
+            if (TextUtils.isEmpty(summary1)) {
+                return summary2;
+            }
+            if (TextUtils.isEmpty(summary2)) {
+                return summary1;
+            }
+            return mContext.getString(R.string.join_many_items_middle, summary1, summary2);
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
+        new SummaryLoader.SummaryProviderFactory() {
+            @Override
+            public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                    SummaryLoader summaryLoader) {
+                return new AdvancedAppSettings.SummaryProvider(activity, summaryLoader);
+            }
+        };
 }
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 9967918..0623562 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -91,7 +91,6 @@
 import com.android.settings.datausage.DataUsageSummary;
 import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
 import com.android.settings.fuelgauge.BatteryEntry;
-import com.android.settings.fuelgauge.PowerUsageDetail;
 import com.android.settings.notification.AppNotificationSettings;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settings.notification.NotificationBackend.AppRow;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
index 93fc6a6..b53a335 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
@@ -49,10 +49,7 @@
     @Override
     public void updateState(Preference preference) {
         final DefaultAppInfo app = getDefaultAppInfo();
-        CharSequence defaultAppLabel = null;
-        if (app != null) {
-            defaultAppLabel = app.loadLabel();
-        }
+        CharSequence defaultAppLabel = getDefaultAppLabel();
         if (!TextUtils.isEmpty(defaultAppLabel)) {
             preference.setSummary(defaultAppLabel);
         } else {
@@ -84,4 +81,15 @@
         //By default return null. It's up to subclasses to provide logic.
         return null;
     }
+
+    public CharSequence getDefaultAppLabel() {
+        if (!isAvailable()) {
+            return null;
+        }
+        final DefaultAppInfo app = getDefaultAppInfo();
+        if (app != null) {
+            return app.loadLabel();
+        }
+        return null;
+    }
 }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
index 661fb5b..5c0f9a3 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
@@ -51,13 +51,9 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        final DefaultAppInfo defaultApp = getDefaultAppInfo();
-        final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
-        if (TextUtils.isEmpty(defaultAppLabel)) {
-            final String onlyAppLabel = getOnlyAppLabel();
-            if (!TextUtils.isEmpty(onlyAppLabel)) {
-                preference.setSummary(onlyAppLabel);
-            }
+        final CharSequence defaultAppLabel = getDefaultAppLabel();
+        if (!TextUtils.isEmpty(defaultAppLabel)) {
+            preference.setSummary(defaultAppLabel);
         }
     }
 
@@ -72,6 +68,19 @@
         }
     }
 
+    @Override
+    public CharSequence getDefaultAppLabel() {
+        if (!isAvailable()) {
+            return null;
+        }
+        final DefaultAppInfo defaultApp = getDefaultAppInfo();
+        final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
+        if (!TextUtils.isEmpty(defaultAppLabel)) {
+            return defaultAppLabel;
+        }
+        return getOnlyAppLabel();
+    }
+
     private List<ResolveInfo> getCandidates() {
         return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL,
                 mUserId);
diff --git a/src/com/android/settings/connecteddevice/UsbModePreferenceController.java b/src/com/android/settings/connecteddevice/UsbModePreferenceController.java
index 6c1a28b..a98f068 100644
--- a/src/com/android/settings/connecteddevice/UsbModePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/UsbModePreferenceController.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.hardware.usb.UsbManager;
+import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 
@@ -77,34 +78,19 @@
         mUsbReceiver.register();
     }
 
-    public static int getSummary(int mode) {
+    @VisibleForTesting
+    int getSummary(int mode) {
         switch (mode) {
             case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
-                return R.string.usb_use_charging_only_desc;
+                return R.string.usb_summary_charging_only;
             case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
-                return R.string.usb_use_power_only_desc;
+                return R.string.usb_summary_power_only;
             case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
-                return R.string.usb_use_file_transfers_desc;
+                return R.string.usb_summary_file_transfers;
             case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
-                return R.string.usb_use_photo_transfers_desc;
+                return R.string.usb_summary_photo_transfers;
             case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
-                return R.string.usb_use_MIDI_desc;
-        }
-        return 0;
-    }
-
-    public static int getTitle(int mode) {
-        switch (mode) {
-            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
-                return R.string.usb_use_charging_only;
-            case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
-                return R.string.usb_use_power_only;
-            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
-                return R.string.usb_use_file_transfers;
-            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
-                return R.string.usb_use_photo_transfers;
-            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
-                return R.string.usb_use_MIDI;
+                return R.string.usb_summary_MIDI;
         }
         return 0;
     }
@@ -117,7 +103,7 @@
         if (preference != null) {
             if (mUsbReceiver.isConnected()) {
                 preference.setEnabled(true);
-                preference.setSummary(getTitle(mode));
+                preference.setSummary(getSummary(mode));
             } else {
                 preference.setSummary(R.string.disconnected);
                 preference.setEnabled(false);
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index d1bb9d6..caac95f 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -76,8 +76,8 @@
 import com.android.settings.deviceinfo.StorageSettings;
 import com.android.settings.display.NightDisplaySettings;
 import com.android.settings.enterprise.EnterprisePrivacySettings;
+import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
 import com.android.settings.fuelgauge.BatterySaverSettings;
-import com.android.settings.fuelgauge.PowerUsageDetail;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.gestures.AssistGestureSettings;
 import com.android.settings.gestures.DoubleTapPowerSettings;
@@ -210,7 +210,7 @@
             ZenModeEventRuleSettings.class.getName(),
             ZenModeVisualInterruptionSettings.class.getName(),
             ProcessStatsUi.class.getName(),
-            PowerUsageDetail.class.getName(),
+            AdvancedPowerUsageDetail.class.getName(),
             ProcessStatsSummary.class.getName(),
             DrawOverlayDetails.class.getName(),
             WriteSettingsDetails.class.getName(),
diff --git a/src/com/android/settings/deviceinfo/UsbModeChooserActivity.java b/src/com/android/settings/deviceinfo/UsbModeChooserActivity.java
index 5ac16d4..8ba3781 100644
--- a/src/com/android/settings/deviceinfo/UsbModeChooserActivity.java
+++ b/src/com/android/settings/deviceinfo/UsbModeChooserActivity.java
@@ -31,6 +31,7 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.support.annotation.VisibleForTesting;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -40,7 +41,6 @@
 
 import com.android.settings.R;
 import com.android.settingslib.RestrictedLockUtils;
-import com.android.settings.connecteddevice.UsbModePreferenceController;
 
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
@@ -136,9 +136,9 @@
         View v = mLayoutInflater.inflate(R.layout.restricted_radio_with_summary, container, false);
 
         TextView titleView = (TextView) v.findViewById(android.R.id.title);
-        titleView.setText(UsbModePreferenceController.getTitle(mode));
+        titleView.setText(getTitle(mode));
         TextView summaryView = (TextView) v.findViewById(android.R.id.summary);
-        summaryView.setText(UsbModePreferenceController.getSummary(mode));
+        updateSummary(summaryView, mode);
 
         if (disallowedByAdmin) {
             if (mEnforcedAdmin != null) {
@@ -178,4 +178,27 @@
         }
     }
 
+    @VisibleForTesting
+    static void updateSummary(TextView summaryView, int mode) {
+        if (mode == (UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE)) {
+            summaryView.setText(R.string.usb_use_power_only_desc);
+        }
+    }
+
+    @VisibleForTesting
+    static int getTitle(int mode) {
+        switch (mode) {
+            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
+                return R.string.usb_use_charging_only;
+            case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
+                return R.string.usb_use_power_only;
+            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
+                return R.string.usb_use_file_transfers;
+            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
+                return R.string.usb_use_photo_transfers;
+            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
+                return R.string.usb_use_MIDI;
+        }
+        return 0;
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 8be3b14..39b72cc 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -58,7 +58,6 @@
  * 1. Detail battery usage information for app(i.e. usage time, usage amount)
  * 2. Battery related controls for app(i.e uninstall, force stop)
  *
- * This fragment will replace {@link PowerUsageDetail}
  */
 public class AdvancedPowerUsageDetail extends PowerUsageBase implements
         ButtonActionDialogFragment.AppButtonsDialogListener {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
deleted file mode 100644
index f0d0a10..0000000
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ /dev/null
@@ -1,826 +0,0 @@
-/*
- * Copyright (C) 2009 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.fuelgauge;
-
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.ApplicationErrorReport;
-import android.app.admin.DevicePolicyManager;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.BatteryStats;
-import android.os.Bundle;
-import android.os.Process;
-import android.os.UserHandle;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceClickListener;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceScreen;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatterySipper.DrainType;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.internal.util.FastPrintWriter;
-import com.android.settings.AppHeader;
-import com.android.settings.DisplaySettings;
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.Utils;
-import com.android.settings.applications.AppHeaderController;
-import com.android.settings.applications.InstalledAppDetails;
-import com.android.settings.applications.LayoutPreference;
-import com.android.settings.bluetooth.BluetoothSettings;
-import com.android.settings.core.PreferenceController;
-import com.android.settings.location.LocationSettings;
-import com.android.settings.network.NetworkDashboardFragment;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.wifi.WifiSettings;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.List;
-
-// TODO(b/35810915): Delete this page once ag/1971493 is done.
-public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickListener {
-
-    // Note: Must match the sequence of the DrainType
-    private static int[] sDrainTypeDesciptions = new int[] {
-        R.string.battery_desc_standby,
-        R.string.battery_desc_radio,
-        R.string.battery_desc_voice,
-        R.string.battery_desc_wifi,
-        R.string.battery_desc_bluetooth,
-        R.string.battery_desc_flashlight,
-        R.string.battery_desc_display,
-        R.string.battery_desc_apps,
-        R.string.battery_desc_users,
-        R.string.battery_desc_unaccounted,
-        R.string.battery_desc_overcounted,
-        R.string.battery_desc_camera,
-    };
-
-    public static void startBatteryDetailPage(SettingsActivity caller,
-            PreferenceFragment fragment, BatteryStatsHelper helper, int statsType,
-            BatteryEntry entry, boolean showLocationButton, boolean includeAppInfo) {
-        // Initialize mStats if necessary.
-        helper.getStats();
-
-        final int dischargeAmount = helper.getStats().getDischargeAmount(statsType);
-        Bundle args = new Bundle();
-        args.putString(PowerUsageDetail.EXTRA_TITLE, entry.name);
-        args.putInt(PowerUsageDetail.EXTRA_PERCENT, (int)
-                ((entry.sipper.totalPowerMah * dischargeAmount / helper.getTotalPower()) + .5));
-        args.putInt(PowerUsageDetail.EXTRA_GAUGE, (int)
-                Math.ceil(entry.sipper.totalPowerMah * 100 / helper.getMaxPower()));
-        args.putLong(PowerUsageDetail.EXTRA_USAGE_DURATION, helper.getStatsPeriod());
-        args.putString(PowerUsageDetail.EXTRA_ICON_PACKAGE, entry.defaultPackageName);
-        args.putInt(PowerUsageDetail.EXTRA_ICON_ID, entry.iconId);
-        args.putDouble(PowerUsageDetail.EXTRA_NO_COVERAGE, entry.sipper.noCoveragePercent);
-        if (entry.sipper.uidObj != null) {
-            args.putInt(PowerUsageDetail.EXTRA_UID, entry.sipper.uidObj.getUid());
-        }
-        args.putSerializable(PowerUsageDetail.EXTRA_DRAIN_TYPE, entry.sipper.drainType);
-        args.putBoolean(PowerUsageDetail.EXTRA_SHOW_LOCATION_BUTTON, showLocationButton);
-        args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, !includeAppInfo);
-
-        int userId = UserHandle.myUserId();
-        int[] types;
-        double[] values;
-        switch (entry.sipper.drainType) {
-            case APP:
-            case USER:
-            {
-                BatteryStats.Uid uid = entry.sipper.uidObj;
-                types = new int[] {
-                    R.string.usage_type_cpu,
-                    R.string.usage_type_cpu_foreground,
-                    R.string.usage_type_wake_lock,
-                    R.string.usage_type_gps,
-                    R.string.usage_type_wifi_running,
-                    R.string.usage_type_data_recv,
-                    R.string.usage_type_data_send,
-                    R.string.usage_type_radio_active,
-                    R.string.usage_type_data_wifi_recv,
-                    R.string.usage_type_data_wifi_send,
-                    R.string.usage_type_audio,
-                    R.string.usage_type_video,
-                    R.string.usage_type_camera,
-                    R.string.usage_type_flashlight,
-                    R.string.usage_type_computed_power,
-                };
-                values = new double[] {
-                    entry.sipper.cpuTimeMs,
-                    entry.sipper.cpuFgTimeMs,
-                    entry.sipper.wakeLockTimeMs,
-                    entry.sipper.gpsTimeMs,
-                    entry.sipper.wifiRunningTimeMs,
-                    entry.sipper.mobileRxPackets,
-                    entry.sipper.mobileTxPackets,
-                    entry.sipper.mobileActive,
-                    entry.sipper.wifiRxPackets,
-                    entry.sipper.wifiTxPackets,
-                    0,
-                    0,
-                    entry.sipper.cameraTimeMs,
-                    entry.sipper.flashlightTimeMs,
-                    entry.sipper.totalPowerMah,
-                };
-
-                if (entry.sipper.drainType == BatterySipper.DrainType.APP) {
-                    Writer result = new StringWriter();
-                    PrintWriter printWriter = new FastPrintWriter(result, false, 1024);
-                    helper.getStats().dumpLocked(caller, printWriter, "", helper.getStatsType(),
-                            uid.getUid());
-                    printWriter.flush();
-                    args.putString(PowerUsageDetail.EXTRA_REPORT_DETAILS, result.toString());
-
-                    result = new StringWriter();
-                    printWriter = new FastPrintWriter(result, false, 1024);
-                    helper.getStats().dumpCheckinLocked(caller, printWriter, helper.getStatsType(),
-                            uid.getUid());
-                    printWriter.flush();
-                    args.putString(PowerUsageDetail.EXTRA_REPORT_CHECKIN_DETAILS,
-                            result.toString());
-                    if (uid.getUid() != 0) {
-                        userId = UserHandle.getUserId(uid.getUid());
-                    }
-                }
-            }
-            break;
-            case CELL:
-            {
-                types = new int[] {
-                    R.string.usage_type_on_time,
-                    R.string.usage_type_no_coverage,
-                    R.string.usage_type_radio_active,
-                    R.string.usage_type_computed_power,
-                };
-                values = new double[] {
-                    entry.sipper.usageTimeMs,
-                    entry.sipper.noCoveragePercent,
-                    entry.sipper.mobileActive,
-                    entry.sipper.totalPowerMah,
-                };
-            }
-            break;
-            case WIFI:
-            {
-                types = new int[] {
-                    R.string.usage_type_wifi_running,
-                    R.string.usage_type_cpu,
-                    R.string.usage_type_cpu_foreground,
-                    R.string.usage_type_wake_lock,
-                    R.string.usage_type_data_recv,
-                    R.string.usage_type_data_send,
-                    R.string.usage_type_data_wifi_recv,
-                    R.string.usage_type_data_wifi_send,
-                    R.string.usage_type_computed_power,
-                };
-                values = new double[] {
-                    entry.sipper.wifiRunningTimeMs,
-                    entry.sipper.cpuTimeMs,
-                    entry.sipper.cpuFgTimeMs,
-                    entry.sipper.wakeLockTimeMs,
-                    entry.sipper.mobileRxPackets,
-                    entry.sipper.mobileTxPackets,
-                    entry.sipper.wifiRxPackets,
-                    entry.sipper.wifiTxPackets,
-                    entry.sipper.totalPowerMah,
-                };
-            } break;
-            case BLUETOOTH:
-            {
-                types = new int[] {
-                    R.string.usage_type_on_time,
-                    R.string.usage_type_cpu,
-                    R.string.usage_type_cpu_foreground,
-                    R.string.usage_type_wake_lock,
-                    R.string.usage_type_data_recv,
-                    R.string.usage_type_data_send,
-                    R.string.usage_type_data_wifi_recv,
-                    R.string.usage_type_data_wifi_send,
-                    R.string.usage_type_computed_power,
-                };
-                values = new double[] {
-                    entry.sipper.usageTimeMs,
-                    entry.sipper.cpuTimeMs,
-                    entry.sipper.cpuFgTimeMs,
-                    entry.sipper.wakeLockTimeMs,
-                    entry.sipper.mobileRxPackets,
-                    entry.sipper.mobileTxPackets,
-                    entry.sipper.wifiRxPackets,
-                    entry.sipper.wifiTxPackets,
-                    entry.sipper.totalPowerMah,
-                };
-            } break;
-            case UNACCOUNTED:
-            {
-                types = new int[] {
-                    R.string.usage_type_total_battery_capacity,
-                    R.string.usage_type_computed_power,
-                    R.string.usage_type_actual_power,
-                };
-                values = new double[] {
-                    helper.getPowerProfile().getBatteryCapacity(),
-                    helper.getComputedPower(),
-                    helper.getMinDrainedPower(),
-                };
-            } break;
-            case OVERCOUNTED:
-            {
-                types = new int[] {
-                    R.string.usage_type_total_battery_capacity,
-                    R.string.usage_type_computed_power,
-                    R.string.usage_type_actual_power,
-                };
-                values = new double[] {
-                    helper.getPowerProfile().getBatteryCapacity(),
-                    helper.getComputedPower(),
-                    helper.getMaxDrainedPower(),
-                };
-            } break;
-            default:
-            {
-                types = new int[] {
-                    R.string.usage_type_on_time,
-                    R.string.usage_type_computed_power,
-                };
-                values = new double[] {
-                    entry.sipper.usageTimeMs,
-                    entry.sipper.totalPowerMah,
-                };
-            }
-        }
-        args.putIntArray(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
-        args.putDoubleArray(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
-
-        caller.startPreferencePanelAsUser(fragment, PowerUsageDetail.class.getName(), args,
-                R.string.details_title, null, new UserHandle(userId));
-    }
-
-    public static final int ACTION_DISPLAY_SETTINGS = 1;
-    public static final int ACTION_WIFI_SETTINGS = 2;
-    public static final int ACTION_BLUETOOTH_SETTINGS = 3;
-    public static final int ACTION_WIRELESS_SETTINGS = 4;
-    public static final int ACTION_APP_DETAILS = 5;
-    public static final int ACTION_LOCATION_SETTINGS = 6;
-    public static final int ACTION_FORCE_STOP = 7;
-    public static final int ACTION_REPORT = 8;
-
-    public static final int USAGE_SINCE_UNPLUGGED = 1;
-    public static final int USAGE_SINCE_RESET = 2;
-
-    public static final String EXTRA_TITLE = "title";
-    public static final String EXTRA_PERCENT = "percent";
-    public static final String EXTRA_GAUGE = "gauge";
-    public static final String EXTRA_UID = "uid";
-    public static final String EXTRA_USAGE_SINCE = "since";
-    public static final String EXTRA_USAGE_DURATION = "duration";
-    public static final String EXTRA_REPORT_DETAILS = "report_details";
-    public static final String EXTRA_REPORT_CHECKIN_DETAILS = "report_checkin_details";
-    public static final String EXTRA_DETAIL_TYPES = "types"; // Array of usage types (cpu, gps, etc)
-    public static final String EXTRA_DETAIL_VALUES = "values"; // Array of doubles
-    public static final String EXTRA_DRAIN_TYPE = "drainType"; // DrainType
-    public static final String EXTRA_ICON_PACKAGE = "iconPackage"; // String
-    public static final String EXTRA_NO_COVERAGE = "noCoverage";
-    public static final String EXTRA_ICON_ID = "iconId"; // Int
-    public static final String EXTRA_SHOW_LOCATION_BUTTON = "showLocationButton";  // Boolean
-
-    private static final String TAG = "PowerUsageDetail";
-
-    private static final String KEY_DETAILS_PARENT = "details_parent";
-    private static final String KEY_CONTROLS_PARENT = "controls_parent";
-    private static final String KEY_MESSAGES_PARENT = "messages_parent";
-    private static final String KEY_PACKAGES_PARENT = "packages_parent";
-    private static final String KEY_TWO_BUTTONS = "two_buttons";
-    private static final String KEY_HIGH_POWER = "high_power";
-
-    private PackageManager mPm;
-    private DevicePolicyManager mDpm;
-    private int[] mTypes;
-    private int mUid;
-    private double[] mValues;
-    private Button mForceStopButton;
-    private Button mReportButton;
-    private BatterySipper.DrainType mDrainType;
-    private double mNoCoverage; // Percentage of time that there was no coverage
-    private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
-
-    private PreferenceCategory mDetailsParent;
-    private PreferenceCategory mControlsParent;
-    private PreferenceCategory mMessagesParent;
-    private PreferenceCategory mPackagesParent;
-
-    private boolean mUsesGps;
-    private boolean mShowLocationButton;
-
-    private String[] mPackages;
-
-    ApplicationInfo mApp;
-    ComponentName mInstaller;
-    private Preference mHighPower;
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        Activity activity = getActivity();
-        mPm = activity.getPackageManager();
-        mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
-
-        mDetailsParent = (PreferenceCategory) findPreference(KEY_DETAILS_PARENT);
-        mControlsParent = (PreferenceCategory) findPreference(KEY_CONTROLS_PARENT);
-        mMessagesParent = (PreferenceCategory) findPreference(KEY_MESSAGES_PARENT);
-        mPackagesParent = (PreferenceCategory) findPreference(KEY_PACKAGES_PARENT);
-
-        mPowerUsageFeatureProvider =
-                FeatureFactory.getFactory(activity).getPowerUsageFeatureProvider(activity);
-
-        createDetails();
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.FUELGAUGE_POWER_USAGE_DETAIL;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        checkForceStop();
-        if (mHighPower != null) {
-            mHighPower.setSummary(HighPowerDetail.getSummary(getActivity(), mApp.packageName));
-        }
-
-        setupHeader();
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.power_usage_details;
-    }
-
-    @Override
-    protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final List<PreferenceController> controllers = new ArrayList<>();
-        final int uid = getArguments().getInt(EXTRA_UID, 0);
-        controllers.add(new BackgroundActivityPreferenceController(context, uid));
-
-        return controllers;
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-        if (mHighPower != null) {
-            mHighPower.setSummary(HighPowerDetail.getSummary(getActivity(), mApp.packageName));
-        }
-    }
-
-    private void createDetails() {
-        final Bundle args = getArguments();
-        Context context = getActivity();
-        mUid = args.getInt(EXTRA_UID, 0);
-        mPackages = context.getPackageManager().getPackagesForUid(mUid);
-        mDrainType = (BatterySipper.DrainType) args.getSerializable(EXTRA_DRAIN_TYPE);
-        mNoCoverage = args.getDouble(EXTRA_NO_COVERAGE, 0);
-        mShowLocationButton = args.getBoolean(EXTRA_SHOW_LOCATION_BUTTON);
-
-        mTypes = args.getIntArray(EXTRA_DETAIL_TYPES);
-        mValues = args.getDoubleArray(EXTRA_DETAIL_VALUES);
-
-        LayoutPreference twoButtons = (LayoutPreference) findPreference(KEY_TWO_BUTTONS);
-        mForceStopButton = (Button) twoButtons.findViewById(R.id.left_button);
-        mReportButton = (Button) twoButtons.findViewById(R.id.right_button);
-        mForceStopButton.setEnabled(false);
-
-        if (mUid >= Process.FIRST_APPLICATION_UID) {
-            mForceStopButton.setText(R.string.force_stop);
-            mForceStopButton.setTag(ACTION_FORCE_STOP);
-            mForceStopButton.setOnClickListener(this);
-            mReportButton.setText(com.android.internal.R.string.report);
-            mReportButton.setTag(ACTION_REPORT);
-            mReportButton.setOnClickListener(this);
-
-            if (mPackages != null && mPackages.length > 0) {
-                try {
-                    mApp = context.getPackageManager().getApplicationInfo(
-                            mPackages[0], 0);
-                } catch (NameNotFoundException e) {
-                }
-            } else {
-                Log.d(TAG, "No packages!!");
-            }
-            // check if error reporting is enabled in secure settings
-            int enabled = android.provider.Settings.Global.getInt(context.getContentResolver(),
-                    android.provider.Settings.Global.SEND_ACTION_APP_ERROR, 0);
-            if (enabled != 0) {
-                if (mApp != null) {
-                    mInstaller = ApplicationErrorReport.getErrorReportReceiver(
-                            context, mPackages[0], mApp.flags);
-                }
-                mReportButton.setEnabled(mInstaller != null);
-            } else {
-                removePreference(KEY_TWO_BUTTONS);
-            }
-            if (mApp != null
-                    && PowerWhitelistBackend.getInstance().isWhitelisted(mApp.packageName)) {
-                mHighPower = findPreference(KEY_HIGH_POWER);
-                mHighPower.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-                    @Override
-                    public boolean onPreferenceClick(Preference preference) {
-                        HighPowerDetail.show(PowerUsageDetail.this, mApp.packageName, 0, false);
-                        return true;
-                    }
-                });
-            } else {
-                mControlsParent.removePreference(findPreference(KEY_HIGH_POWER));
-            }
-        } else {
-            removePreference(KEY_TWO_BUTTONS);
-            mControlsParent.removePreference(findPreference(KEY_HIGH_POWER));
-        }
-
-        refreshStats();
-
-        fillDetailsSection();
-        fillPackagesSection(mUid);
-        fillControlsSection(mUid);
-        fillMessagesSection(mUid);
-    }
-
-    private void setupHeader() {
-        final Activity activity = getActivity();
-        final Bundle args = getArguments();
-        final String title = args.getString(EXTRA_TITLE);
-        final int iconId = args.getInt(EXTRA_ICON_ID, 0);
-        String pkg = args.getString(EXTRA_ICON_PACKAGE);
-        Drawable appIcon = null;
-        int uid = -1;
-        final PackageManager pm = activity.getPackageManager();
-
-        if (!TextUtils.isEmpty(pkg)) {
-            try {
-                ApplicationInfo ai = pm.getPackageInfo(pkg, 0).applicationInfo;
-                if (ai != null) {
-                    appIcon = ai.loadIcon(pm);
-                    uid = ai.uid;
-                }
-            } catch (NameNotFoundException nnfe) {
-                // Use default icon
-            }
-        } else if (iconId != 0) {
-            appIcon = activity.getDrawable(iconId);
-        }
-        if (appIcon == null) {
-            appIcon = activity.getPackageManager().getDefaultActivityIcon();
-        }
-
-        if (pkg == null && mPackages != null) {
-            pkg = mPackages[0];
-        }
-        final PreferenceScreen screen = getPreferenceScreen();
-        final Preference appHeaderPref =
-            findPreference(AppHeaderController.PREF_KEY_APP_HEADER);
-        if (appHeaderPref != null) {
-            return;
-        }
-        final Preference pref = FeatureFactory.getFactory(activity)
-            .getApplicationFeatureProvider(activity)
-            .newAppHeaderController(this, null /* appHeader */)
-            .setIcon(appIcon)
-            .setLabel(title)
-            .setPackageName(pkg)
-            .setUid(uid)
-            .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
-                AppHeaderController.ActionType.ACTION_NONE)
-            .done(getPrefContext());
-        screen.addPreference(pref);
-    }
-
-    @Override
-    public void onClick(View v) {
-        doAction((Integer) v.getTag());
-    }
-
-    // utility method used to start sub activity
-    private void startApplicationDetailsActivity() {
-        // start new fragment to display extended information
-        Bundle args = new Bundle();
-        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackages[0]);
-
-        SettingsActivity sa = (SettingsActivity) getActivity();
-        sa.startPreferencePanel(this, InstalledAppDetails.class.getName(), args,
-                R.string.application_info_label, null, null, 0);
-    }
-
-    private void doAction(int action) {
-        SettingsActivity sa = (SettingsActivity)getActivity();
-        switch (action) {
-            case ACTION_DISPLAY_SETTINGS:
-                sa.startPreferencePanel(this, DisplaySettings.class.getName(), null,
-                        R.string.display_settings_title, null, null, 0);
-                break;
-            case ACTION_WIFI_SETTINGS:
-                sa.startPreferencePanel(this, WifiSettings.class.getName(), null,
-                        R.string.wifi_settings, null, null, 0);
-                break;
-            case ACTION_BLUETOOTH_SETTINGS:
-                sa.startPreferencePanel(this, BluetoothSettings.class.getName(), null,
-                        R.string.bluetooth_settings, null, null, 0);
-                break;
-            case ACTION_WIRELESS_SETTINGS:
-                sa.startPreferencePanel(this, NetworkDashboardFragment.class.getName(), null,
-                        R.string.radio_controls_title, null, null, 0);
-                break;
-            case ACTION_APP_DETAILS:
-                startApplicationDetailsActivity();
-                break;
-            case ACTION_LOCATION_SETTINGS:
-                sa.startPreferencePanel(this, LocationSettings.class.getName(), null,
-                        R.string.location_settings_title, null, null, 0);
-                break;
-            case ACTION_FORCE_STOP:
-                killProcesses();
-                break;
-            case ACTION_REPORT:
-                reportBatteryUse();
-                break;
-        }
-    }
-
-    private void fillDetailsSection() {
-        if (mTypes != null && mValues != null) {
-            for (int i = 0; i < mTypes.length; i++) {
-                // Only add an item if the time is greater than zero
-                if (mValues[i] <= 0) continue;
-                final String label = getString(mTypes[i]);
-                String value = null;
-                switch (mTypes[i]) {
-                    case R.string.usage_type_data_recv:
-                    case R.string.usage_type_data_send:
-                    case R.string.usage_type_data_wifi_recv:
-                    case R.string.usage_type_data_wifi_send:
-                        final long packets = (long) (mValues[i]);
-                        value = Long.toString(packets);
-                        break;
-                    case R.string.usage_type_no_coverage:
-                        final int percentage = (int) Math.floor(mValues[i]);
-                        value = Utils.formatPercentage(percentage);
-                        break;
-                    case R.string.usage_type_total_battery_capacity:
-                    case R.string.usage_type_computed_power:
-                    case R.string.usage_type_actual_power:
-                        value = getActivity().getString(R.string.mah, (long)(mValues[i]));
-                        break;
-                    case R.string.usage_type_gps:
-                        mUsesGps = true;
-                        // Fall through
-                    default:
-                        value = Utils.formatElapsedTime(getActivity(), mValues[i], true);
-                }
-                addHorizontalPreference(mDetailsParent, label, value);
-            }
-        }
-    }
-
-    private void addHorizontalPreference(PreferenceCategory parent, CharSequence title,
-            CharSequence summary) {
-        Preference pref = new Preference(getPrefContext());
-        pref.setLayoutResource(R.layout.horizontal_preference);
-        pref.setTitle(title);
-        pref.setSummary(summary);
-        pref.setSelectable(false);
-        parent.addPreference(pref);
-    }
-
-    private void fillControlsSection(int uid) {
-        PackageManager pm = getActivity().getPackageManager();
-        String[] packages = pm.getPackagesForUid(uid);
-        PackageInfo pi = null;
-        try {
-            pi = packages != null ? pm.getPackageInfo(packages[0], 0) : null;
-        } catch (NameNotFoundException nnfe) { /* Nothing */ }
-        ApplicationInfo ai = pi != null? pi.applicationInfo : null;
-
-        boolean removeHeader = true;
-        switch (mDrainType) {
-            case APP:
-                // If it is a Java application and only one package is associated with the Uid
-                if (packages != null && packages.length == 1) {
-                    addControl(R.string.battery_action_app_details,
-                            R.string.battery_sugg_apps_info, ACTION_APP_DETAILS);
-                    removeHeader = false;
-                    // If the application has a settings screen, jump to  that
-                    // TODO:
-                }
-
-                // If power usage detail page is launched from location page, suppress "Location"
-                // button to prevent circular loops.
-                if (mUsesGps && mShowLocationButton
-                        && mPowerUsageFeatureProvider.isLocationSettingEnabled(packages)) {
-                    addControl(R.string.location_settings_title,
-                            R.string.battery_sugg_apps_gps, ACTION_LOCATION_SETTINGS);
-                    removeHeader = false;
-                }
-                break;
-            case SCREEN:
-                addControl(R.string.display_settings,
-                        R.string.battery_sugg_display,
-                        ACTION_DISPLAY_SETTINGS);
-                removeHeader = false;
-                break;
-            case WIFI:
-                addControl(R.string.wifi_settings,
-                        R.string.battery_sugg_wifi,
-                        ACTION_WIFI_SETTINGS);
-                removeHeader = false;
-                break;
-            case BLUETOOTH:
-                addControl(R.string.bluetooth_settings,
-                        R.string.battery_sugg_bluetooth_basic,
-                        ACTION_BLUETOOTH_SETTINGS);
-                removeHeader = false;
-                break;
-            case CELL:
-                if (mNoCoverage > 10) {
-                    addControl(R.string.radio_controls_title,
-                            R.string.battery_sugg_radio,
-                            ACTION_WIRELESS_SETTINGS);
-                    removeHeader = false;
-                }
-                break;
-        }
-        if (removeHeader) {
-            mControlsParent.setTitle(null);
-        }
-    }
-
-    private void addControl(int pageSummary, int actionTitle, final int action) {
-        Preference pref = new Preference(getPrefContext());
-        pref.setTitle(actionTitle);
-        pref.setLayoutResource(R.layout.horizontal_preference);
-        pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-            @Override
-            public boolean onPreferenceClick(Preference preference) {
-                doAction(action);
-                return true;
-            }
-        });
-        mControlsParent.addPreference(pref);
-    }
-
-    private void fillMessagesSection(int uid) {
-        boolean removeHeader = true;
-        switch (mDrainType) {
-            case UNACCOUNTED:
-                addMessage(R.string.battery_msg_unaccounted);
-                removeHeader = false;
-                break;
-        }
-        if (removeHeader) {
-            mMessagesParent.setTitle(null);
-        }
-    }
-
-    private void addMessage(int message) {
-        addHorizontalPreference(mMessagesParent, getString(message), null);
-    }
-
-    private void removePackagesSection() {
-        getPreferenceScreen().removePreference(mPackagesParent);
-    }
-
-    private void killProcesses() {
-        if (mPackages == null) return;
-        ActivityManager am = (ActivityManager)getActivity().getSystemService(
-                Context.ACTIVITY_SERVICE);
-        final int userId = UserHandle.getUserId(mUid);
-        for (int i = 0; i < mPackages.length; i++) {
-            am.forceStopPackageAsUser(mPackages[i], userId);
-        }
-        checkForceStop();
-    }
-
-    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            mForceStopButton.setEnabled(getResultCode() != Activity.RESULT_CANCELED);
-        }
-    };
-
-    private void checkForceStop() {
-        if (mPackages == null || mUid < Process.FIRST_APPLICATION_UID) {
-            mForceStopButton.setEnabled(false);
-            return;
-        }
-        for (int i = 0; i < mPackages.length; i++) {
-            if (mDpm.packageHasActiveAdmins(mPackages[i])) {
-                mForceStopButton.setEnabled(false);
-                return;
-            }
-        }
-        for (int i = 0; i < mPackages.length; i++) {
-            try {
-                ApplicationInfo info = mPm.getApplicationInfo(mPackages[i], 0);
-                if ((info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
-                    mForceStopButton.setEnabled(true);
-                    break;
-                }
-            } catch (PackageManager.NameNotFoundException e) {
-            }
-        }
-        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
-                Uri.fromParts("package", mPackages[0], null));
-        intent.putExtra(Intent.EXTRA_PACKAGES, mPackages);
-        intent.putExtra(Intent.EXTRA_UID, mUid);
-        intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mUid));
-        getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
-                Activity.RESULT_CANCELED, null, null);
-    }
-
-    private void reportBatteryUse() {
-        if (mPackages == null) return;
-
-        ApplicationErrorReport report = new ApplicationErrorReport();
-        report.type = ApplicationErrorReport.TYPE_BATTERY;
-        report.packageName = mPackages[0];
-        report.installerPackageName = mInstaller.getPackageName();
-        report.processName = mPackages[0];
-        report.time = System.currentTimeMillis();
-        report.systemApp = (mApp.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
-
-        final Bundle args = getArguments();
-        ApplicationErrorReport.BatteryInfo batteryInfo = new ApplicationErrorReport.BatteryInfo();
-        batteryInfo.usagePercent = args.getInt(EXTRA_PERCENT, 1);
-        batteryInfo.durationMicros = args.getLong(EXTRA_USAGE_DURATION, 0);
-        batteryInfo.usageDetails = args.getString(EXTRA_REPORT_DETAILS);
-        batteryInfo.checkinDetails = args.getString(EXTRA_REPORT_CHECKIN_DETAILS);
-        report.batteryInfo = batteryInfo;
-
-        Intent result = new Intent(Intent.ACTION_APP_ERROR);
-        result.setComponent(mInstaller);
-        result.putExtra(Intent.EXTRA_BUG_REPORT, report);
-        result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        startActivity(result);
-    }
-
-    private void fillPackagesSection(int uid) {
-        if (uid < 1) {
-            removePackagesSection();
-            return;
-        }
-        if (mPackages == null || mPackages.length < 2) {
-            removePackagesSection();
-            return;
-        }
-
-        PackageManager pm = getPackageManager();
-        // Convert package names to user-facing labels where possible
-        for (int i = 0; i < mPackages.length; i++) {
-            try {
-                ApplicationInfo ai = pm.getApplicationInfo(mPackages[i], 0);
-                CharSequence label = ai.loadLabel(pm);
-                if (label != null) {
-                    mPackages[i] = label.toString();
-                }
-                addHorizontalPreference(mPackagesParent, mPackages[i], null);
-            } catch (NameNotFoundException e) {
-            }
-        }
-    }
-}
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index f8cedc1..f7882ae 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -50,7 +50,6 @@
 import com.android.settings.enterprise.EnterprisePrivacySettings;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageAdvanced;
-import com.android.settings.fuelgauge.PowerUsageDetail;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.gestures.AssistGestureSettings;
 import com.android.settings.gestures.DoubleTapPowerSettings;
@@ -126,7 +125,6 @@
         addIndex(StorageSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_storage);
         addIndex(PowerUsageSummary.class,
                 R.xml.power_usage_summary, R.drawable.ic_settings_battery);
-        addIndex(PowerUsageDetail.class, NO_DATA_RES_ID, R.drawable.ic_settings_battery);
         addIndex(PowerUsageAdvanced.class, NO_DATA_RES_ID, R.drawable.ic_settings_battery);
         addIndex(BatterySaverSettings.class,
                 R.xml.battery_saver_settings, R.drawable.ic_settings_battery);
diff --git a/tests/app/src/com/android/settings/DisplaySettingsTest.java b/tests/app/src/com/android/settings/DisplaySettingsTest.java
new file mode 100644
index 0000000..888b7fd
--- /dev/null
+++ b/tests/app/src/com/android/settings/DisplaySettingsTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2017 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 android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DisplaySettingsTest {
+
+    private Instrumentation mInstrumentation;
+    private Context mContext;
+    private UiDevice mDevice;
+
+    @Before
+    public void setUp() {
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        mContext = mInstrumentation.getTargetContext();
+        mDevice = UiDevice.getInstance(mInstrumentation);
+    }
+
+    @Test
+    public void launchBrightnessLevel_shouldNotCrash() {
+        mInstrumentation.startActivitySync(
+                new Intent(mContext, DisplaySettings.class));
+        onView(withText(mContext.getString(R.string.brightness))).perform(click());
+        // should not crash
+        mDevice.pressBack(); // dismiss the brightness dialog
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
index 03a8f94..91111a8 100644
--- a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
@@ -16,13 +16,17 @@
 
 package com.android.settings;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.IContentProvider;
 import android.content.pm.PackageManager;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
 import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
 
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
@@ -39,13 +43,17 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
 
 import java.util.Map;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -121,7 +129,6 @@
         verify(mContext).getString(R.string.security_dashboard_summary);
     }
 
-
     @Test
     public void testGetPackageVerifierSummary_nullInput() {
         assertThat(mSummaryProvider.getPackageVerifierSummary(null)).isNull();
@@ -155,4 +162,28 @@
         assertThat(mSummaryProvider.getPackageVerifierSummary(mDashboardCategory))
                 .isEqualTo(MOCK_SUMMARY);
     }
+
+    @Test
+    public void testInitTrustAgentPreference_secure_shouldSetSummaryToNumberOfTrustAgent() {
+        final Preference preference = mock(Preference.class);
+        final PreferenceScreen screen = mock(PreferenceScreen.class);
+        when(screen.findPreference(SecuritySettings.KEY_MANAGE_TRUST_AGENTS))
+                .thenReturn(preference);
+        final LockPatternUtils utils = mock(LockPatternUtils.class);
+        when(utils.isSecure(anyInt())).thenReturn(true);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        final Activity activity = mock(Activity.class);
+        when(activity.getResources()).thenReturn(context.getResources());
+        final SecuritySettings securitySettings = spy(new SecuritySettings());
+        when(securitySettings.getActivity()).thenReturn(activity);
+
+        ReflectionHelpers.setField(securitySettings, "mLockPatternUtils", utils);
+
+        securitySettings.initTrustAgentPreference(screen, 0);
+        verify(preference).setSummary(R.string.manage_trust_agents_summary);
+
+        securitySettings.initTrustAgentPreference(screen, 2);
+        verify(preference).setSummary(context.getResources().getQuantityString(
+            R.plurals.manage_trust_agents_summary_on, 2, 2));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java b/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
index b8f3fc4..bedb0a5 100644
--- a/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
@@ -22,22 +22,30 @@
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
+import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
+import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
+import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
+import com.android.settings.dashboard.SummaryLoader;
 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;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class AdvancedAppSettingsTest {
 
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
 
     private AdvancedAppSettings mFragment;
@@ -46,8 +54,9 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
+        mContext = RuntimeEnvironment.application;
         mFragment = new AdvancedAppSettings();
-        mFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
+        mFragment.onAttach(mContext);
     }
 
     @Test
@@ -56,4 +65,75 @@
                 R.xml.app_default_settings);
     }
 
+    @Test
+    public void setListening_shouldUpdateSummary() {
+        final SummaryLoader summaryLoader = mock(SummaryLoader.class);
+        final AdvancedAppSettings.SummaryProvider summaryProvider =
+            new AdvancedAppSettings.SummaryProvider(mContext, summaryLoader);
+        final DefaultSmsPreferenceController defaultSms =
+            mock(DefaultSmsPreferenceController.class);
+        final DefaultBrowserPreferenceController defaultBrowser =
+            mock(DefaultBrowserPreferenceController.class);
+        final DefaultPhonePreferenceController defaultPhone =
+            mock(DefaultPhonePreferenceController.class);
+        ReflectionHelpers.setField(summaryProvider, "mDefaultSmsPreferenceController", defaultSms);
+        ReflectionHelpers.setField(
+            summaryProvider, "mDefaultBrowserPreferenceController", defaultBrowser);
+        ReflectionHelpers.setField(
+            summaryProvider, "mDefaultPhonePreferenceController", defaultPhone);
+
+        // all available
+        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
+        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
+        summaryProvider.setListening(true);
+        verify(summaryLoader).setSummary(summaryProvider, "Sms1, Browser1, Phone1");
+
+        // 2 available
+        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
+        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
+        summaryProvider.setListening(true);
+        verify(summaryLoader).setSummary(summaryProvider, "Browser1, Phone1");
+
+        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
+        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
+        summaryProvider.setListening(true);
+        verify(summaryLoader).setSummary(summaryProvider, "Sms1, Phone1");
+
+        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
+        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
+        summaryProvider.setListening(true);
+        verify(summaryLoader).setSummary(summaryProvider, "Sms1, Browser1");
+
+        // 1 available
+        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
+        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
+        summaryProvider.setListening(true);
+        verify(summaryLoader).setSummary(summaryProvider, "Browser1");
+
+        when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
+        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
+        summaryProvider.setListening(true);
+        verify(summaryLoader).setSummary(summaryProvider, "Sms1");
+
+        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
+        when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
+        summaryProvider.setListening(true);
+        verify(summaryLoader).setSummary(summaryProvider, "Phone1");
+
+        // None available
+        when(defaultSms.getDefaultAppLabel()).thenReturn(null);
+        when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
+        when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
+        summaryProvider.setListening(true);
+        verify(summaryLoader, never()).setSummary(summaryProvider, eq(anyString()));
+
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/UsbModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/UsbModePreferenceControllerTest.java
index 8b6e900..4b84b0f 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/UsbModePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/UsbModePreferenceControllerTest.java
@@ -48,62 +48,32 @@
 
     @Test
     public void testGetSummary_chargeDevice() {
-        assertThat(UsbModePreferenceController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[0]))
-                .isEqualTo(R.string.usb_use_charging_only_desc);
+        assertThat(mController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[0]))
+                .isEqualTo(R.string.usb_summary_charging_only);
     }
 
     @Test
     public void testGetSummary_supplyPower() {
-        assertThat(UsbModePreferenceController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[1]))
-                .isEqualTo(R.string.usb_use_power_only_desc);
+        assertThat(mController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[1]))
+                .isEqualTo(R.string.usb_summary_power_only);
     }
 
     @Test
     public void testGetSummary_TransferFiles() {
-        assertThat(UsbModePreferenceController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[2]))
-                .isEqualTo(R.string.usb_use_file_transfers_desc);
+        assertThat(mController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[2]))
+                .isEqualTo(R.string.usb_summary_file_transfers);
     }
 
     @Test
     public void testGetSummary_TransferPhoto() {
-        assertThat(UsbModePreferenceController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[3]))
-                .isEqualTo(R.string.usb_use_photo_transfers_desc);
+        assertThat(mController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[3]))
+                .isEqualTo(R.string.usb_summary_photo_transfers);
     }
 
     @Test
     public void testGetSummary_MIDI() {
-        assertThat(UsbModePreferenceController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[4]))
-                .isEqualTo(R.string.usb_use_MIDI_desc);
-    }
-
-    @Test
-    public void testGetTitle_chargeDevice() {
-        assertThat(UsbModePreferenceController.getTitle(UsbModeChooserActivity.DEFAULT_MODES[0]))
-                .isEqualTo(R.string.usb_use_charging_only);
-    }
-
-    @Test
-    public void testGetTitle_supplyPower() {
-        assertThat(UsbModePreferenceController.getTitle(UsbModeChooserActivity.DEFAULT_MODES[1]))
-                .isEqualTo(R.string.usb_use_power_only);
-    }
-
-    @Test
-    public void testGetTitle_TransferFiles() {
-        assertThat(UsbModePreferenceController.getTitle(UsbModeChooserActivity.DEFAULT_MODES[2]))
-                .isEqualTo(R.string.usb_use_file_transfers);
-    }
-
-    @Test
-    public void testGetTitle_TransferPhoto() {
-        assertThat(UsbModePreferenceController.getTitle(UsbModeChooserActivity.DEFAULT_MODES[3]))
-                .isEqualTo(R.string.usb_use_photo_transfers);
-    }
-
-    @Test
-    public void testGetTitle_MIDI() {
-        assertThat(UsbModePreferenceController.getTitle(UsbModeChooserActivity.DEFAULT_MODES[4]))
-                .isEqualTo(R.string.usb_use_MIDI);
+        assertThat(mController.getSummary(UsbModeChooserActivity.DEFAULT_MODES[4]))
+                .isEqualTo(R.string.usb_summary_MIDI);
     }
 
     @Test
@@ -131,7 +101,7 @@
         mContext.sendStickyBroadcast(intent);
 
         assertThat(preference.getSummary()).isEqualTo(
-                mContext.getString(R.string.usb_use_charging_only));
+                mContext.getString(R.string.usb_summary_charging_only));
     }
 
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/UsbModeChooserActivityTest.java b/tests/robotests/src/com/android/settings/deviceinfo/UsbModeChooserActivityTest.java
new file mode 100644
index 0000000..d9c474d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deviceinfo/UsbModeChooserActivityTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2017 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.deviceinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.widget.TextView;
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class UsbModeChooserActivityTest {
+
+    @Mock
+    private TextView mTextView;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void updateSummary_chargeDevice_shouldNotSetSummary() {
+        UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[0]);
+        verify(mTextView, never()).setText(anyInt());
+    }
+
+    @Test
+    public void updateSummary_supplyPower_shouldSetSummary() {
+        UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[1]);
+        verify(mTextView).setText(R.string.usb_use_power_only_desc);
+    }
+
+    @Test
+    public void updateSummary_transferFiles_shouldNotSetSummary() {
+        UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[2]);
+        verify(mTextView, never()).setText(anyInt());
+    }
+
+    @Test
+    public void updateSummary_transferPhoto_shouldNotSetSummary() {
+        UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[3]);
+        verify(mTextView, never()).setText(anyInt());
+    }
+
+    @Test
+    public void updateSummary_MIDI_shouldNotSetSummary() {
+        UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[4]);
+        verify(mTextView, never()).setText(anyInt());
+    }
+
+    @Test
+    public void getTitle_shouldReturnCorrectTitle() {
+        assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[0]))
+                .isEqualTo(R.string.usb_use_charging_only);
+
+        assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[1]))
+                .isEqualTo(R.string.usb_use_power_only);
+
+        assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[2]))
+                .isEqualTo(R.string.usb_use_file_transfers);
+
+        assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[3]))
+                .isEqualTo(R.string.usb_use_photo_transfers);
+
+        assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[4]))
+                .isEqualTo(R.string.usb_use_MIDI);
+    }
+
+}
\ No newline at end of file
