Merge "Adjust UX for toggles when active scorer is not set."
diff --git a/res/layout/storage_item.xml b/res/layout/storage_item.xml
index 72c8ee3..4b14bb3 100644
--- a/res/layout/storage_item.xml
+++ b/res/layout/storage_item.xml
@@ -21,8 +21,8 @@
               android:minHeight="?android:attr/listPreferredItemHeightSmall"
               android:gravity="center_vertical"
               android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-              android:paddingTop="16dip"
-              android:paddingBottom="16dip"
+              android:paddingTop="14dp"
+              android:paddingBottom="14dp"
               android:background="?android:attr/selectableItemBackground"
               android:clipToPadding="false">
 
@@ -52,36 +52,41 @@
                 android:maxHeight="24dp"/>
         </LinearLayout>
 
-        <TextView
-            android:id="@android:id/title"
-            android:layout_width="0dp"
+        <RelativeLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:singleLine="true"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:textAlignment="viewStart"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal" />
+            android:gravity="center_vertical" >
 
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
-            android:textColor="?android:attr/textColorSecondaryNoDisable"
-            android:maxLines="10" />
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                android:textAlignment="viewStart"
+                android:ellipsize="marquee"
+                android:fadingEdge="horizontal" />
 
+            <TextView
+                android:id="@android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAlignment="viewStart"
+                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textColor="?android:attr/textColorSecondaryNoDisable"
+                android:maxLines="10"
+                android:layout_alignParentEnd="true"/>
+
+            <ProgressBar
+                android:id="@android:id/progress"
+                android:layout_width="match_parent"
+                android:layout_height="8dp"
+                android:layout_marginTop="12dp"
+                android:layout_marginBottom="4dp"
+                android:max="100"
+                android:layout_below="@android:id/title"
+                android:layout_alignStart="@android:id/title"
+                style="?android:attr/progressBarStyleHorizontal" />
+        </RelativeLayout>
     </LinearLayout>
-
-    <ProgressBar
-        android:id="@android:id/progress"
-        android:layout_width="match_parent"
-        android:layout_height="8dp"
-        android:layout_marginStart="72dp"
-        android:layout_marginTop="16dp"
-        android:layout_marginBottom="8dp"
-        android:max="100"
-        style="?android:attr/progressBarStyleHorizontal" />
-
 </LinearLayout>
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index aa1540d..919f321 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -39,15 +39,18 @@
 
         <Preference
             android:key="app_usage_foreground"
-            android:title="@string/battery_detail_foreground"/>
+            android:title="@string/battery_detail_foreground"
+            android:selectable="false"/>
 
         <Preference
             android:key="app_usage_background"
-            android:title="@string/battery_detail_background"/>
+            android:title="@string/battery_detail_background"
+            android:selectable="false"/>
 
         <Preference
             android:key="app_power_usage"
-            android:title="@string/battery_detail_power_usage"/>
+            android:title="@string/battery_detail_power_usage"
+            android:selectable="false"/>
 
     </PreferenceCategory>
 
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index b8646f7..b6a7b02 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -122,7 +122,10 @@
         }
         Log.v(TAG, "foreground time(us): " + timeUs);
 
-        return convertUsToMs(timeUs);
+        // Return the min value of STATE_TOP time and foreground activity time, since both of these
+        // time have some errors.
+        return convertUsToMs(
+                Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs)));
     }
 
     /**
@@ -167,15 +170,13 @@
      */
     @VisibleForTesting
     void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper) {
-        final long rawRealtimeMs = SystemClock.elapsedRealtime();
         long totalActivityTimeMs = 0;
         final SparseLongArray activityTimeArray = new SparseLongArray();
         for (int i = 0, size = sippers.size(); i < size; i++) {
             final BatteryStats.Uid uid = sippers.get(i).uidObj;
             if (uid != null) {
-                final long timeMs = Math.min(getForegroundActivityTotalTimeMs(uid, rawRealtimeMs),
-                        getProcessTimeMs(StatusType.FOREGROUND, uid,
-                                BatteryStats.STATS_SINCE_CHARGED));
+                final long timeMs = getProcessTimeMs(StatusType.FOREGROUND, uid,
+                        BatteryStats.STATS_SINCE_CHARGED);
                 activityTimeArray.put(uid.getUid(), timeMs);
                 totalActivityTimeMs += timeMs;
             }
@@ -332,11 +333,10 @@
     }
 
     @VisibleForTesting
-    long getForegroundActivityTotalTimeMs(BatteryStats.Uid uid, long rawRealtimeMs) {
+    long getForegroundActivityTotalTimeUs(BatteryStats.Uid uid, long rawRealtimeUs) {
         final BatteryStats.Timer timer = uid.getForegroundActivityTimer();
         if (timer != null) {
-            return convertUsToMs(timer.getTotalTimeLocked(convertMsToUs(rawRealtimeMs),
-                            BatteryStats.STATS_SINCE_CHARGED));
+            return timer.getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
         }
 
         return 0;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index a78c385..0cabb05 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -119,6 +119,8 @@
     private LoaderManager mLoaderManager;
     @Mock
     private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
+    @Mock
+    private BatteryStats.Timer mTimer;
     private Context mContext;
     private Preference mForegroundPreference;
     private Preference mBackgroundPreference;
@@ -168,6 +170,8 @@
                 eq(BatteryStats.Uid.PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
         doReturn(FOREGROUND_TIME_US).when(mUid).getProcessStateTime(
                 eq(BatteryStats.Uid.PROCESS_STATE_TOP), anyLong(), anyInt());
+        doReturn(mTimer).when(mUid).getForegroundActivityTimer();
+        doReturn(FOREGROUND_TIME_US).when(mTimer).getTotalTimeLocked(anyLong(), anyInt());
         ReflectionHelpers.setField(mBatteryEntry, "sipper", mBatterySipper);
         mBatteryEntry.iconId = ICON_ID;
         mBatterySipper.uidObj = mUid;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index 151463a..e2c6f6d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -178,6 +178,9 @@
 
     @Test
     public void testGetProcessTimeMs_typeForeground_timeCorrect() {
+        doReturn(TIME_STATE_FOREGROUND + 500).when(mBatteryUtils).getForegroundActivityTotalTimeUs(
+                eq(mUid), anyLong());
+
         final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid,
                 BatteryStats.STATS_SINCE_CHARGED);
 
@@ -194,6 +197,9 @@
 
     @Test
     public void testGetProcessTimeMs_typeAll_timeCorrect() {
+        doReturn(TIME_STATE_FOREGROUND + 500).when(mBatteryUtils).getForegroundActivityTotalTimeUs(
+                eq(mUid), anyLong());
+
         final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid,
                 BatteryStats.STATS_SINCE_CHARGED);
 
@@ -305,13 +311,13 @@
     @Test
     public void testSmearScreenBatterySipper() {
         final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO,
-                TIME_FOREGROUND_ZERO + 500, BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */);
-        final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO + 100,
-                TIME_FOREGROUND_ZERO, BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */);
+                BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */);
+        final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO,
+                BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */);
         final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND,
-                TIME_FOREGROUND + 200, BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */);
-        final BatterySipper sipperFg2 = createTestSmearBatterySipper(TIME_FOREGROUND + 600,
-                TIME_FOREGROUND, BATTERY_APP_USAGE, 3 /* uid */, false /* isUidNull */);
+                BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */);
+        final BatterySipper sipperFg2 = createTestSmearBatterySipper(TIME_FOREGROUND,
+                BATTERY_APP_USAGE, 3 /* uid */, false /* isUidNull */);
 
         final List<BatterySipper> sippers = new ArrayList<>();
         sippers.add(sipperNull);
@@ -370,16 +376,16 @@
 
     @Test
     public void testGetForegroundActivityTotalTimeMs_returnMilliseconds() {
-        final long rawRealtimeMs = SystemClock.elapsedRealtime();
+        final long rawRealtimeUs = SystemClock.elapsedRealtime() * 1000;
         doReturn(mTimer).when(mUid).getForegroundActivityTimer();
         doReturn(TIME_SINCE_LAST_FULL_CHARGE_US).when(mTimer)
-                .getTotalTimeLocked(rawRealtimeMs * 1000, BatteryStats.STATS_SINCE_CHARGED);
+                .getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
 
-        assertThat(mBatteryUtils.getForegroundActivityTotalTimeMs(mUid, rawRealtimeMs)).isEqualTo(
-                TIME_SINCE_LAST_FULL_CHARGE_MS);
+        assertThat(mBatteryUtils.getForegroundActivityTotalTimeUs(mUid, rawRealtimeUs)).isEqualTo(
+                TIME_SINCE_LAST_FULL_CHARGE_US);
     }
 
-    private BatterySipper createTestSmearBatterySipper(long activityTime, long topTime,
+    private BatterySipper createTestSmearBatterySipper(long topTime,
             double totalPowerMah, int uidCode, boolean isUidNull) {
         final BatterySipper sipper = mock(BatterySipper.class);
         sipper.drainType = BatterySipper.DrainType.APP;
@@ -387,8 +393,6 @@
         doReturn(uidCode).when(sipper).getUid();
         if (!isUidNull) {
             final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS);
-            doReturn(activityTime).when(mBatteryUtils).getForegroundActivityTotalTimeMs(eq(uid),
-                    anyLong());
             doReturn(topTime).when(mBatteryUtils).getProcessTimeMs(
                     eq(BatteryUtils.StatusType.FOREGROUND), eq(uid), anyInt());
             doReturn(uidCode).when(uid).getUid();