diff --git a/res/layout/power_usage_action_item.xml b/res/layout/power_usage_action_item.xml
new file mode 100644
index 0000000..7b81ec1
--- /dev/null
+++ b/res/layout/power_usage_action_item.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:gravity="center_vertical"
+    android:paddingLeft="4dip"
+    android:focusable="true"
+    android:orientation="vertical"
+    android:paddingRight="?android:attr/scrollbarSize">
+
+    <TextView android:id="@+id/summary"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="2dip"
+            android:ellipsize="marquee"
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
+
+    <LinearLayout
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+        <!-- Spacer -->
+        <View
+                android:id="@+id/buttons_spacer_left"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:layout_weight="0.7"
+                android:visibility="invisible" />
+
+        <Button
+                android:id="@+id/action_button"
+                android:layout_width="150dip"
+                android:paddingRight="6dip"
+                android:layout_weight="0.3"
+                android:layout_height="wrap_content"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/power_usage_details.xml b/res/layout/power_usage_details.xml
index ea7cfb3..f7485ee 100644
--- a/res/layout/power_usage_details.xml
+++ b/res/layout/power_usage_details.xml
@@ -103,43 +103,18 @@
         </LinearLayout>
 
         <LinearLayout
-            android:id="@+id/controls_section"
+            android:id="@+id/controls"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical">
 
             <TextView
-                android:id="@+id/controls_section_title"
+                android:id="@+id/controls_title"
                 style="?android:attr/listSeparatorTextViewStyle"
                 android:layout_marginTop="6dip"
                 android:text="@string/controls_subtitle" />
-            
-            <RelativeLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content">
 
-                <Button
-                    android:id="@+id/action_button1"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="6dip"
-                    android:layout_marginTop="6dip"
-                    android:layout_marginBottom="6dip"
-                    android:layout_marginRight="6dip"
-                    android:layout_alignParentLeft="true"
-                    android:layout_weight="1"/>
-                <Button
-                    android:id="@+id/action_button2"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="6dip"
-                    android:layout_marginTop="6dip"
-                    android:layout_marginBottom="6dip"
-                    android:layout_marginRight="6dip"
-                    android:layout_alignParentRight="true"
-                    android:layout_weight="1"/>
-
-            </RelativeLayout>
+            <!-- Controls go here ... -->
 
         </LinearLayout>
                     
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 62150f2..0aa74aa 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1651,6 +1651,8 @@
     <string name="battery_since_reset">Battery use since reset</string>
     <!-- Battery usage duration -->
     <string name="battery_stats_duration"><xliff:g id="time">%1$s</xliff:g> since unplugged</string>
+    <!-- Battery usage during last unplugged period -->
+    <string name="battery_stats_last_duration">@string/menu_stats_last_unplugged</string>
     <!-- CPU awake time title -->
     <string name="awake">Device awake time</string>
     <!-- Wifi on time -->
@@ -1700,7 +1702,9 @@
     <!-- Label for Video usage time -->
     <string name="usage_type_video">Video</string>
     <!-- Label for time that a feature has been on -->
-    <string name="usage_type_on_time">On time</string>
+    <string name="usage_type_on_time">Time on</string>
+    <!-- Label for time that there was no cell coverage -->
+    <string name="usage_type_no_coverage">Time without a signal</string>
     <!-- Label for force stop action -->
     <string name="battery_action_stop">Force stop</string>
     <!-- Label for app details action -->
@@ -1747,7 +1751,7 @@
     <!-- Suggestion for exploring application info to stop or uninstall -->
     <string name="battery_sugg_apps_info">Stop or uninstall the application</string>
     <!-- Suggestion for getting apps to consume less power due to GPS-->
-    <string name="battery_sugg_apps_gps">Turn off GPS when you're not using it</string>
+    <string name="battery_sugg_apps_gps">"Turn off GPS when you're not using it"</string>
     <!-- Suggestion for getting apps to consume less power -->
     <string name="battery_sugg_apps_settings">The application may offer settings to reduce battery use</string>
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index e78e041..737627a 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -24,6 +24,7 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.provider.Settings;
@@ -60,12 +61,13 @@
         R.string.battery_desc_display,
         R.string.battery_desc_apps
     };
-    
+
     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 = 6;
+    public static final int ACTION_APP_DETAILS = 5;
+    public static final int ACTION_SECURITY_SETTINGS = 6;
 
     public static final int USAGE_SINCE_UNPLUGGED = 1;
     public static final int USAGE_SINCE_RESET = 2;
@@ -80,6 +82,7 @@
     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
 
     private static final boolean DEBUG = true;
@@ -90,16 +93,16 @@
     private double[] mValues;
     private TextView mTitleView;
     private ViewGroup mDetailsParent;
+    private ViewGroup mControlsParent;
     private long mStartTime;
     private DrainType mDrainType;
-    private int mAction1;
-    private int mAction2;
     private PercentageBar mGauge;
     private Drawable mAppIcon;
+    private double mNoCoverage; // Percentage of time that there was no coverage
+
+    private boolean mUsesGps;
 
     private static final String TAG = "PowerUsageDetail";
-    private Button mButton1;
-    private Button mButton2;
     private String[] mPackages;
 
     @Override
@@ -128,6 +131,7 @@
         mUsageSince = intent.getIntExtra(EXTRA_USAGE_SINCE, USAGE_SINCE_UNPLUGGED);
         mUid = intent.getIntExtra(EXTRA_UID, 0);
         mDrainType = (DrainType) intent.getSerializableExtra(EXTRA_DRAIN_TYPE);
+        mNoCoverage = intent.getDoubleExtra(EXTRA_NO_COVERAGE, 0);
         String iconPackage = intent.getStringExtra(EXTRA_ICON_PACKAGE);
         int iconId = intent.getIntExtra(EXTRA_ICON_ID, 0);
         if (!TextUtils.isEmpty(iconPackage)) {
@@ -167,8 +171,46 @@
 
         ImageView iconImage = (ImageView) findViewById(R.id.icon);
         iconImage.setImageDrawable(mAppIcon);
-        
+
         mDetailsParent = (ViewGroup) findViewById(R.id.details);
+        mControlsParent = (ViewGroup) findViewById(R.id.controls);
+
+        fillDetailsSection();
+        fillPackagesSection(mUid);
+        fillControlsSection(mUid);
+    }
+
+    public void onClick(View v) {
+        doAction((Integer) v.getTag());
+    }
+
+    private void doAction(int action) {
+        switch (action) {
+            case ACTION_DISPLAY_SETTINGS:
+                startActivity(new Intent(Settings.ACTION_DISPLAY_SETTINGS));
+                break;
+            case ACTION_WIFI_SETTINGS:
+                startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
+                break;
+            case ACTION_BLUETOOTH_SETTINGS:
+                startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
+                break;
+            case ACTION_WIRELESS_SETTINGS:
+                startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
+                break;
+            case ACTION_APP_DETAILS:
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                intent.setClass(this, InstalledAppDetails.class);
+                intent.putExtra("com.android.settings.ApplicationPkgName", mPackages[0]);
+                startActivity(intent);
+                break;
+            case ACTION_SECURITY_SETTINGS:
+                startActivity(new Intent(Settings.ACTION_SECURITY_SETTINGS));
+                break;
+        }
+    }
+
+    private void fillDetailsSection() {
         LayoutInflater inflater = getLayoutInflater();
         if (mTypes != null && mValues != null) {
             for (int i = 0; i < mTypes.length; i++) {
@@ -181,6 +223,12 @@
                     case R.string.usage_type_data_send:
                         value = Utils.formatBytes(this, mValues[i]);
                         break;
+                    case R.string.usage_type_no_coverage:
+                        value = String.format("%d%%", (int) Math.floor(mValues[i]));
+                        break;
+                    case R.string.usage_type_gps:
+                        mUsesGps = true;
+                        // Fall through
                     default:
                         value = Utils.formatElapsedTime(this, mValues[i]);
                 }
@@ -193,41 +241,9 @@
                 valueView.setText(value);
             }
         }
-
-        fillPackagesSection(mUid);
-        fillControlsSection(mUid);
-    }
-
-    public void onClick(View v) {
-        int action = v == mButton1 ? mAction1 : mAction2;
-        doAction(action);
-    }
-
-    private void doAction(int action) {
-        switch (action) {
-            case ACTION_DISPLAY_SETTINGS:
-                startActivity(new Intent(Settings.ACTION_DISPLAY_SETTINGS));
-                break;
-            case ACTION_WIFI_SETTINGS:
-                startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
-                break;
-            case ACTION_BLUETOOTH_SETTINGS:
-                startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
-                break;
-            case ACTION_APP_DETAILS:
-                Intent intent = new Intent(Intent.ACTION_VIEW);
-                intent.setClass(this, InstalledAppDetails.class);
-                intent.putExtra("com.android.settings.ApplicationPkgName", mPackages[0]);
-                startActivity(intent);
-                break;
-        }
     }
 
     private void fillControlsSection(int uid) {
-        String label1 = null;
-        String label2 = null;
-        mAction1 = 0;
-        mAction2 = 0;
         PackageManager pm = getPackageManager();
         String[] packages = pm.getPackagesForUid(uid);
         PackageInfo pi = null;
@@ -237,43 +253,66 @@
         ApplicationInfo ai = pi != null? pi.applicationInfo : null;
         boolean isSystem = ai != null? (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0 : false;
 
-        if (uid < 1000 || !isSystem) { 
-            switch (mDrainType) {
-                case APP:
-                    //label1 = getString(R.string.battery_action_stop);
-                    if (packages != null) {
-                        label2 = getString(R.string.battery_action_app_details);
-                        mAction2 = ACTION_APP_DETAILS;
-                    }
-                    break;
-                case SCREEN:
-                    label2 = getString(R.string.battery_action_display);
-                    mAction2 = ACTION_DISPLAY_SETTINGS;
-                    break;
-                case WIFI:
-                    label2 = getString(R.string.battery_action_wifi);
-                    mAction2 = ACTION_WIRELESS_SETTINGS;
-                    break;
-                case BLUETOOTH:
-                    //label2 = getString(R.string.battery_action_bluetooth);
-                    //mAction2 = ACTION_BLUETOOTH_SETTINGS;
-                    break;
-            }
+        boolean removeHeader = true;
+        switch (mDrainType) {
+            case APP:
+                // If it is a Java application and it's not a system application
+                if (packages != null && !isSystem) {
+                    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 (mUsesGps) {
+                    addControl(R.string.security_settings_title,
+                            R.string.battery_sugg_apps_gps, ACTION_SECURITY_SETTINGS);
+                    removeHeader = false;
+                }
+                break;
+            case SCREEN:
+                addControl(R.string.sound_and_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;
         }
-        mButton1 = (Button) findViewById(R.id.action_button1);
-        mButton2 = (Button) findViewById(R.id.action_button2);
-        mButton1.setOnClickListener(this);
-        mButton2.setOnClickListener(this);
-        if (label1 == null) {
-            mButton1.setVisibility(View.GONE);
-        } else {
-            mButton1.setText(label1);
+        if (removeHeader) {
+            mControlsParent.setVisibility(View.GONE);
         }
-        if (label2 == null) {
-            findViewById(R.id.controls_section).setVisibility(View.GONE);
-        } else {
-            mButton2.setText(label2);
-        }
+    }
+
+    private void addControl(int title, int summary, int action) {
+        final Resources res = getResources();
+        LayoutInflater inflater = getLayoutInflater();
+        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_action_item,null);
+        mControlsParent.addView(item);
+        Button actionButton = (Button) item.findViewById(R.id.action_button);
+        TextView summaryView = (TextView) item.findViewById(R.id.summary);
+        actionButton.setText(res.getString(title));
+        summaryView.setText(res.getString(summary));
+        actionButton.setOnClickListener(this);
+        actionButton.setTag(new Integer(action));
     }
 
     private void removePackagesSection() {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 8df0919..3dc9914 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -80,9 +80,6 @@
 
     private double mMaxPower = 1;
     private double mTotalPower;
-
-    private boolean mScaleByMax = true;
-
     private PowerProfile mPowerProfile;
 
     private HashMap<String,UidToDetail> mUidCache = new HashMap<String,UidToDetail>();
@@ -137,15 +134,19 @@
                 Math.ceil(sipper.getSortValue() * 100 / mMaxPower));
         intent.putExtra(PowerUsageDetail.EXTRA_ICON_PACKAGE, sipper.defaultPackageName);
         intent.putExtra(PowerUsageDetail.EXTRA_ICON_ID, sipper.iconId);
+        intent.putExtra(PowerUsageDetail.EXTRA_NO_COVERAGE, sipper.noCoveragePercent);
         if (sipper.uidObj != null) {
             intent.putExtra(PowerUsageDetail.EXTRA_UID, sipper.uidObj.getUid());
         }
         intent.putExtra(PowerUsageDetail.EXTRA_DRAIN_TYPE, sipper.drainType);
+
+        int[] types;
+        double[] values;
         switch (sipper.drainType) {
             case APP:
             {
                 Uid uid = sipper.uidObj;
-                int[] types = new int[] {
+                types = new int[] {
                     R.string.usage_type_cpu,
                     R.string.usage_type_cpu_foreground,
                     R.string.usage_type_gps,
@@ -154,7 +155,7 @@
                     R.string.usage_type_audio,
                     R.string.usage_type_video,
                 };
-                double[] values = new double[] {
+                values = new double[] {
                     sipper.cpuTime,
                     sipper.cpuFgTime,
                     sipper.gpsTime,
@@ -163,23 +164,33 @@
                     0,
                     0
                 };
-                intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
-                intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
 
             }
             break;
+            case CELL:
+            {
+                types = new int[] {
+                    R.string.usage_type_on_time,
+                    R.string.usage_type_no_coverage
+                };
+                values = new double[] {
+                    sipper.usageTime,
+                    sipper.noCoveragePercent
+                };
+            }
+            break;
             default:
             {
-                int[] types = new int[] {
+                types = new int[] {
                     R.string.usage_type_on_time
                 };
-                double[] values = new double[] {
+                values = new double[] {
                     sipper.usageTime
                 };
-                intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
-                intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
             }
         }
+        intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
+        intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
         startActivity(intent);
 
         return super.onPreferenceTreeClick(preferenceScreen, preference);
@@ -243,19 +254,19 @@
         mAppListGroup.setOrderingAsAdded(false);
 
         Collections.sort(mUsageList);
-        for (BatterySipper g : mUsageList) {
-            if (g.getSortValue() < MIN_POWER_THRESHOLD) continue;
-            double percent =  ((g.getSortValue() / mTotalPower) * 100);
-            if (percent < 1) continue;
-            PowerGaugePreference pref = new PowerGaugePreference(this, g.getIcon(), g);
-            double scaleByMax = (g.getSortValue() * 100) / mMaxPower;
-            g.percent = percent;
-            pref.setTitle(g.name);
-            pref.setPercent(percent);
-            pref.setOrder(Integer.MAX_VALUE - (int) g.getSortValue()); // Invert the order
-            pref.setGaugeValue(mScaleByMax ? scaleByMax : percent);
-            if (g.uidObj != null) {
-                pref.setKey(Integer.toString(g.uidObj.getUid()));
+        for (BatterySipper sipper : mUsageList) {
+            if (sipper.getSortValue() < MIN_POWER_THRESHOLD) continue;
+            final double percentOfTotal =  ((sipper.getSortValue() / mTotalPower) * 100);
+            if (percentOfTotal < 1) continue;
+            PowerGaugePreference pref = new PowerGaugePreference(this, sipper.getIcon(), sipper);
+            double percentOfMax = (sipper.getSortValue() * 100) / mMaxPower;
+            sipper.percent = percentOfTotal;
+            pref.setTitle(sipper.name);
+            pref.setPercent(percentOfTotal);
+            pref.setOrder(Integer.MAX_VALUE - (int) sipper.getSortValue()); // Invert the order
+            pref.setGaugeValue(percentOfMax);
+            if (sipper.uidObj != null) {
+                pref.setKey(Integer.toString(sipper.uidObj.getUid()));
             }
             mAppListGroup.addPreference(pref);
             if (mAppListGroup.getPreferenceCount() > MAX_ITEMS_TO_LIST) break;
@@ -275,7 +286,9 @@
 
     private void updateStatsPeriod(long duration) {
         String durationString = Utils.formatElapsedTime(this, duration / 1000);
-        String label = getString(R.string.battery_stats_duration, durationString);
+        String label = getString(mStats.isOnBattery()
+                ? R.string.battery_stats_duration
+                : R.string.battery_stats_last_duration, durationString);
         setTitle(label);
     }
 
@@ -415,8 +428,13 @@
                     * mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ON, i);
             signalTimeMs += strengthTimeMs;
         }
-        addEntry(getString(R.string.power_cell), DrainType.CELL, signalTimeMs,
+        BatterySipper bs =
+                addEntry(getString(R.string.power_cell), DrainType.CELL, signalTimeMs,
                 android.R.drawable.ic_menu_sort_by_size, power);
+        if (signalTimeMs != 0) {
+            bs.noCoveragePercent = mStats.getPhoneSignalStrengthTime(0, uSecNow, mStatsType)
+                    / 1000 * 100.0 / signalTimeMs;
+        }
     }
 
     private void addWiFiUsage(long uSecNow) {
@@ -441,6 +459,10 @@
         long btOnTimeMs = mStats.getBluetoothOnTime(uSecNow, mStatsType) / 1000;
         double btPower = btOnTimeMs * mPowerProfile.getAveragePower(PowerProfile.POWER_BLUETOOTH_ON)
                 / 1000;
+        int btPingCount = mStats.getBluetoothPingCount();
+        btPower += (btPingCount
+                * mPowerProfile.getAveragePower(PowerProfile.POWER_BLUETOOTH_AT_CMD)) / 1000;
+
         addEntry(getString(R.string.power_bluetooth), DrainType.IDLE, btOnTimeMs,
                 com.android.internal.R.drawable.ic_volume_bluetooth_in_call, btPower);
     }
@@ -456,7 +478,7 @@
                 mStats.getMobileTcpBytesSent(mStatsType);
         final long wifiData = mStats.getTotalTcpBytesReceived(mStatsType) +
                 mStats.getTotalTcpBytesSent(mStatsType) - mobileData;
-        final long radioDataUptimeMs = mStats.getRadioDataUptimeMs();
+        final long radioDataUptimeMs = mStats.getRadioDataUptime() / 1000;
         final long mobileBps = radioDataUptimeMs != 0
                 ? mobileData * 8 * 1000 / radioDataUptimeMs
                 : MOBILE_BPS;
@@ -488,13 +510,15 @@
         addRadioUsage(uSecNow);
     }
 
-    private void addEntry(String label, DrainType drainType, long time, int iconId, double power) {
+    private BatterySipper addEntry(String label, DrainType drainType, long time, int iconId,
+            double power) {
         if (power > mMaxPower) mMaxPower = power;
         mTotalPower += power;
         BatterySipper bs = new BatterySipper(label, drainType, iconId, null, new double[] {power});
         bs.usageTime = time;
         bs.iconId = iconId;
         mUsageList.add(bs);
+        return bs;
     }
 
     private void load() {
@@ -523,6 +547,7 @@
         long gpsTime;
         long cpuFgTime;
         double percent;
+        double noCoveragePercent;
         String defaultPackageName;
 
         BatterySipper(String label, DrainType drainType, int iconId, Uid uid, double[] values) {
@@ -533,7 +558,6 @@
                 icon = getResources().getDrawable(iconId);
             }
             if (values != null) value = values[0];
-            //if (uid > 0 && (mLabel == null || mIcon == null) // TODO:
             if ((label == null || iconId == 0) && uid != null) {
                 getQuickNameIconForUid(uid);
             }
@@ -631,9 +655,9 @@
                 // Look for an official name for this UID.
                 for (String pkgName : packages) {
                     try {
-                        PackageInfo pi = pm.getPackageInfo(pkgName, 0);
+                        final PackageInfo pi = pm.getPackageInfo(pkgName, 0);
                         if (pi.sharedUserLabel != 0) {
-                            CharSequence nm = pm.getText(pkgName,
+                            final CharSequence nm = pm.getText(pkgName,
                                     pi.sharedUserLabel, pi.applicationInfo);
                             if (nm != null) {
                                 name = nm.toString();
