diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 304feb82021..0aaf930e112 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -443,7 +443,7 @@ 1dp 4dp - 2dp + 3dp 1dp 2dp diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java index 4cafbc7b693..7131f28eb20 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java @@ -317,6 +317,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll } int prefIndex = mAppListPrefGroup.getPreferenceCount(); for (BatteryDiffEntry entry : entries) { + boolean isAdded = false; final String appLabel = entry.getAppLabel(); final Drawable appIcon = entry.getAppIcon(); if (TextUtils.isEmpty(appLabel) || appIcon == null) { @@ -324,8 +325,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll continue; } final String prefKey = entry.mBatteryHistEntry.getKey(); - PowerGaugePreference pref = - (PowerGaugePreference) mPreferenceCache.get(prefKey); + PowerGaugePreference pref = mAppListPrefGroup.findPreference(prefKey); + if (pref != null) { + isAdded = true; + Log.w(TAG, "preference should be removed for\n" + entry); + } else { + pref = (PowerGaugePreference) mPreferenceCache.get(prefKey); + } // Creates new innstance if cached preference is not found. if (pref == null) { pref = new PowerGaugePreference(mPrefContext); @@ -340,7 +346,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll // Sets the BatteryDiffEntry to preference for launching detailed page. pref.setBatteryDiffEntry(entry); setPreferenceSummary(pref, entry); - mAppListPrefGroup.addPreference(pref); + if (!isAdded) { + mAppListPrefGroup.addPreference(pref); + } prefIndex++; } } diff --git a/src/com/android/settings/fuelgauge/BatteryChartView.java b/src/com/android/settings/fuelgauge/BatteryChartView.java index 26eb3e40c55..f970072cb94 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartView.java +++ b/src/com/android/settings/fuelgauge/BatteryChartView.java @@ -97,8 +97,18 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick public void setLevels(int[] levels) { // We should provide trapezoid count + 1 data to draw all trapezoids. mLevels = levels.length == mTrapezoidCount + 1 ? levels : null; - setClickable(mLevels != null); + setClickable(false); invalidate(); + if (mLevels == null) { + return; + } + // Sets the chart is clickable if there is at least one valid item in it. + for (int index = 0; index < mLevels.length; index++) { + if (mLevels[index] != 0) { + setClickable(true); + break; + } + } } /** Sets the selected group index to draw highlight effect. */ diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java index 30982da6c8d..2e8726e38ab 100644 --- a/src/com/android/settings/fuelgauge/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/ConvertUtils.java @@ -71,6 +71,7 @@ public final class ConvertUtils { private static String sZoneId; private static SimpleDateFormat sSimpleDateFormat; + private static SimpleDateFormat sSimpleDateFormatForHour; private ConvertUtils() {} @@ -139,10 +140,27 @@ public final class ConvertUtils { sZoneId = currentZoneId; sSimpleDateFormat = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.ENGLISH); + sSimpleDateFormatForHour = null; } return sSimpleDateFormat.format(new Date(timestamp)); } + /** Converts UTC timestamp to local time hour data. */ + public static int utcToLocalTimeHour(long timestamp) { + final String currentZoneId = TimeZone.getDefault().getID(); + if (!currentZoneId.equals(sZoneId) || sSimpleDateFormatForHour == null) { + sZoneId = currentZoneId; + sSimpleDateFormat = null; + sSimpleDateFormatForHour = new SimpleDateFormat("HH", Locale.ENGLISH); + } + try { + return Integer.parseInt( + sSimpleDateFormatForHour.format(new Date(timestamp))); + } catch (NumberFormatException e) { + return Integer.MIN_VALUE; + } + } + /** Gets indexed battery usage data for each corresponding time slot. */ public static Map> getIndexedUsageMap( final Context context, diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index a70a109330c..9f0ffb01b10 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -57,6 +57,8 @@ import java.util.Map; @RunWith(RobolectricTestRunner.class) public final class BatteryChartPreferenceControllerTest { + private static final String PREF_KEY = "pref_key"; + private static final String PREF_SUMMARY = "fake preference summary"; @Mock private InstrumentedPreferenceFragment mFragment; @Mock private SettingsActivity mSettingsActivity; @@ -120,10 +122,9 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testOnDestroy_clearPreferenceCache() { - final String prefKey = "preference fake key"; // Ensures the testing environment is correct. mBatteryChartPreferenceController.mPreferenceCache.put( - prefKey, mPowerGaugePreference); + PREF_KEY, mPowerGaugePreference); assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1); mBatteryChartPreferenceController.onDestroy(); @@ -231,17 +232,16 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testRemoveAndCacheAllPrefs_buildCacheAndRemoveAllPreference() { final int trapezoidIndex = 1; - final String prefKey = "preference fake key"; doReturn(1).when(mAppListGroup).getPreferenceCount(); doReturn(mPowerGaugePreference).when(mAppListGroup).getPreference(0); - doReturn(prefKey).when(mPowerGaugePreference).getKey(); + doReturn(PREF_KEY).when(mPowerGaugePreference).getKey(); // Ensures the testing data is correct. assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty(); mBatteryChartPreferenceController.refreshUi( trapezoidIndex, /*isForce=*/ true); - assertThat(mBatteryChartPreferenceController.mPreferenceCache.get(prefKey)) + assertThat(mBatteryChartPreferenceController.mPreferenceCache.get(PREF_KEY)) .isEqualTo(mPowerGaugePreference); verify(mAppListGroup).removeAll(); } @@ -255,12 +255,12 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testAddPreferenceToScreen_addPreferenceIntoScreen() { - final String prefKey = "preference fake key"; final String appLabel = "fake app label"; doReturn(1).when(mAppListGroup).getPreferenceCount(); doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel(); - doReturn(prefKey).when(mBatteryHistEntry).getKey(); + doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); + doReturn(null).when(mAppListGroup).findPreference(PREF_KEY); mBatteryChartPreferenceController.addPreferenceToScreen( Arrays.asList(mBatteryDiffEntry)); @@ -268,11 +268,11 @@ public final class BatteryChartPreferenceControllerTest { // Verifies the preference cache. final PowerGaugePreference pref = (PowerGaugePreference) mBatteryChartPreferenceController.mPreferenceCache - .get(prefKey); + .get(PREF_KEY); assertThat(pref).isNotNull(); // Verifies the added preference configuration. verify(mAppListGroup).addPreference(pref); - assertThat(pref.getKey()).isEqualTo(prefKey); + assertThat(pref.getKey()).isEqualTo(PREF_KEY); assertThat(pref.getTitle()).isEqualTo(appLabel); assertThat(pref.getIcon()).isEqualTo(mDrawable); assertThat(pref.getOrder()).isEqualTo(1); @@ -280,6 +280,21 @@ public final class BatteryChartPreferenceControllerTest { assertThat(pref.isSingleLineTitle()).isTrue(); } + @Test + public void testAddPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() { + final String appLabel = "fake app label"; + doReturn(1).when(mAppListGroup).getPreferenceCount(); + doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); + doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel(); + doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); + doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY); + + mBatteryChartPreferenceController.addPreferenceToScreen( + Arrays.asList(mBatteryDiffEntry)); + + verify(mAppListGroup, never()).addPreference(any()); + } + @Test public void testHandlePreferenceTreeClick_notPowerGaugePreference_returnFalse() { assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup)) @@ -310,7 +325,7 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testSetPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() { final PowerGaugePreference pref = new PowerGaugePreference(mContext); - pref.setSummary("fake preference summary"); + pref.setSummary(PREF_SUMMARY); mBatteryChartPreferenceController.setPreferenceSummary( pref, createBatteryDiffEntry( @@ -322,7 +337,7 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testSetPreferenceSummary_setBackgroundUsageTimeOnly() { final PowerGaugePreference pref = new PowerGaugePreference(mContext); - pref.setSummary("fake preference summary"); + pref.setSummary(PREF_SUMMARY); mBatteryChartPreferenceController.setPreferenceSummary( pref, createBatteryDiffEntry( @@ -334,7 +349,7 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testSetPreferenceSummary_setTotalUsageTimeLessThanAMinute() { final PowerGaugePreference pref = new PowerGaugePreference(mContext); - pref.setSummary("fake preference summary"); + pref.setSummary(PREF_SUMMARY); mBatteryChartPreferenceController.setPreferenceSummary( pref, createBatteryDiffEntry( @@ -346,7 +361,7 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testSetPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() { final PowerGaugePreference pref = new PowerGaugePreference(mContext); - pref.setSummary("fake preference summary"); + pref.setSummary(PREF_SUMMARY); mBatteryChartPreferenceController.setPreferenceSummary( pref, createBatteryDiffEntry( @@ -358,7 +373,7 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testSetPreferenceSummary_setTotalAndBackgroundUsageTime() { final PowerGaugePreference pref = new PowerGaugePreference(mContext); - pref.setSummary("fake preference summary"); + pref.setSummary(PREF_SUMMARY); mBatteryChartPreferenceController.setPreferenceSummary( pref, createBatteryDiffEntry( @@ -370,7 +385,7 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testSetPreferenceSummary_notAllowShownPackage_setSummayAsNull() { final PowerGaugePreference pref = new PowerGaugePreference(mContext); - pref.setSummary("fake preference summary"); + pref.setSummary(PREF_SUMMARY); final BatteryDiffEntry batteryDiffEntry = spy(createBatteryDiffEntry( /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, @@ -436,33 +451,31 @@ public final class BatteryChartPreferenceControllerTest { @Test public void testOnExpand_expandedIsTrue_addSystemEntriesToPreferenceGroup() { - final String prefKey = "preference_key"; doReturn(1).when(mAppListGroup).getPreferenceCount(); mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry); doReturn("label").when(mBatteryDiffEntry).getAppLabel(); doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); - doReturn(prefKey).when(mBatteryHistEntry).getKey(); + doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ true); final ArgumentCaptor captor = ArgumentCaptor.forClass(Preference.class); verify(mAppListGroup).addPreference(captor.capture()); // Verifies the added preference. - assertThat(captor.getValue().getKey()).isEqualTo(prefKey); + assertThat(captor.getValue().getKey()).isEqualTo(PREF_KEY); } @Test public void testOnExpand_expandedIsFalse_removeSystemEntriesFromPreferenceGroup() { - final String prefKey = "preference_key"; - doReturn(prefKey).when(mBatteryHistEntry).getKey(); - doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(prefKey); + doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); + doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY); mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry); // Verifies the cache is empty first. assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty(); mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ false); - verify(mAppListGroup).findPreference(prefKey); + verify(mAppListGroup).findPreference(PREF_KEY); verify(mAppListGroup).removePreference(mPowerGaugePreference); assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1); }