Avoid add preferenc again if it already in the PreferenceGroup

Bug: 177406865
Bug: 185187729
Test: make SettingsRoboTests
Test: make SettingsGoogleRoboTests
Change-Id: I69f5033c0a07d846c340b9871e69a2cdbe0bb2aa
This commit is contained in:
ykhung
2021-04-23 01:07:09 +08:00
parent 09f6086bea
commit 5c23d65901
5 changed files with 76 additions and 27 deletions

View File

@@ -443,7 +443,7 @@
<!-- Battery usage chart view component --> <!-- Battery usage chart view component -->
<dimen name="chartview_divider_width">1dp</dimen> <dimen name="chartview_divider_width">1dp</dimen>
<dimen name="chartview_divider_height">4dp</dimen> <dimen name="chartview_divider_height">4dp</dimen>
<dimen name="chartview_trapezoid_radius">2dp</dimen> <dimen name="chartview_trapezoid_radius">3dp</dimen>
<dimen name="chartview_trapezoid_margin_start">1dp</dimen> <dimen name="chartview_trapezoid_margin_start">1dp</dimen>
<dimen name="chartview_trapezoid_margin_bottom">2dp</dimen> <dimen name="chartview_trapezoid_margin_bottom">2dp</dimen>
</resources> </resources>

View File

@@ -317,6 +317,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
} }
int prefIndex = mAppListPrefGroup.getPreferenceCount(); int prefIndex = mAppListPrefGroup.getPreferenceCount();
for (BatteryDiffEntry entry : entries) { for (BatteryDiffEntry entry : entries) {
boolean isAdded = false;
final String appLabel = entry.getAppLabel(); final String appLabel = entry.getAppLabel();
final Drawable appIcon = entry.getAppIcon(); final Drawable appIcon = entry.getAppIcon();
if (TextUtils.isEmpty(appLabel) || appIcon == null) { if (TextUtils.isEmpty(appLabel) || appIcon == null) {
@@ -324,8 +325,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
continue; continue;
} }
final String prefKey = entry.mBatteryHistEntry.getKey(); final String prefKey = entry.mBatteryHistEntry.getKey();
PowerGaugePreference pref = PowerGaugePreference pref = mAppListPrefGroup.findPreference(prefKey);
(PowerGaugePreference) mPreferenceCache.get(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. // Creates new innstance if cached preference is not found.
if (pref == null) { if (pref == null) {
pref = new PowerGaugePreference(mPrefContext); pref = new PowerGaugePreference(mPrefContext);
@@ -340,7 +346,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
// Sets the BatteryDiffEntry to preference for launching detailed page. // Sets the BatteryDiffEntry to preference for launching detailed page.
pref.setBatteryDiffEntry(entry); pref.setBatteryDiffEntry(entry);
setPreferenceSummary(pref, entry); setPreferenceSummary(pref, entry);
if (!isAdded) {
mAppListPrefGroup.addPreference(pref); mAppListPrefGroup.addPreference(pref);
}
prefIndex++; prefIndex++;
} }
} }

View File

@@ -97,8 +97,18 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
public void setLevels(int[] levels) { public void setLevels(int[] levels) {
// We should provide trapezoid count + 1 data to draw all trapezoids. // We should provide trapezoid count + 1 data to draw all trapezoids.
mLevels = levels.length == mTrapezoidCount + 1 ? levels : null; mLevels = levels.length == mTrapezoidCount + 1 ? levels : null;
setClickable(mLevels != null); setClickable(false);
invalidate(); 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. */ /** Sets the selected group index to draw highlight effect. */

View File

@@ -71,6 +71,7 @@ public final class ConvertUtils {
private static String sZoneId; private static String sZoneId;
private static SimpleDateFormat sSimpleDateFormat; private static SimpleDateFormat sSimpleDateFormat;
private static SimpleDateFormat sSimpleDateFormatForHour;
private ConvertUtils() {} private ConvertUtils() {}
@@ -139,10 +140,27 @@ public final class ConvertUtils {
sZoneId = currentZoneId; sZoneId = currentZoneId;
sSimpleDateFormat = sSimpleDateFormat =
new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.ENGLISH); new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.ENGLISH);
sSimpleDateFormatForHour = null;
} }
return sSimpleDateFormat.format(new Date(timestamp)); 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. */ /** Gets indexed battery usage data for each corresponding time slot. */
public static Map<Integer, List<BatteryDiffEntry>> getIndexedUsageMap( public static Map<Integer, List<BatteryDiffEntry>> getIndexedUsageMap(
final Context context, final Context context,

View File

@@ -57,6 +57,8 @@ import java.util.Map;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public final class BatteryChartPreferenceControllerTest { 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 InstrumentedPreferenceFragment mFragment;
@Mock private SettingsActivity mSettingsActivity; @Mock private SettingsActivity mSettingsActivity;
@@ -120,10 +122,9 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testOnDestroy_clearPreferenceCache() { public void testOnDestroy_clearPreferenceCache() {
final String prefKey = "preference fake key";
// Ensures the testing environment is correct. // Ensures the testing environment is correct.
mBatteryChartPreferenceController.mPreferenceCache.put( mBatteryChartPreferenceController.mPreferenceCache.put(
prefKey, mPowerGaugePreference); PREF_KEY, mPowerGaugePreference);
assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1); assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1);
mBatteryChartPreferenceController.onDestroy(); mBatteryChartPreferenceController.onDestroy();
@@ -231,17 +232,16 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testRemoveAndCacheAllPrefs_buildCacheAndRemoveAllPreference() { public void testRemoveAndCacheAllPrefs_buildCacheAndRemoveAllPreference() {
final int trapezoidIndex = 1; final int trapezoidIndex = 1;
final String prefKey = "preference fake key";
doReturn(1).when(mAppListGroup).getPreferenceCount(); doReturn(1).when(mAppListGroup).getPreferenceCount();
doReturn(mPowerGaugePreference).when(mAppListGroup).getPreference(0); doReturn(mPowerGaugePreference).when(mAppListGroup).getPreference(0);
doReturn(prefKey).when(mPowerGaugePreference).getKey(); doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
// Ensures the testing data is correct. // Ensures the testing data is correct.
assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty(); assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
mBatteryChartPreferenceController.refreshUi( mBatteryChartPreferenceController.refreshUi(
trapezoidIndex, /*isForce=*/ true); trapezoidIndex, /*isForce=*/ true);
assertThat(mBatteryChartPreferenceController.mPreferenceCache.get(prefKey)) assertThat(mBatteryChartPreferenceController.mPreferenceCache.get(PREF_KEY))
.isEqualTo(mPowerGaugePreference); .isEqualTo(mPowerGaugePreference);
verify(mAppListGroup).removeAll(); verify(mAppListGroup).removeAll();
} }
@@ -255,12 +255,12 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testAddPreferenceToScreen_addPreferenceIntoScreen() { public void testAddPreferenceToScreen_addPreferenceIntoScreen() {
final String prefKey = "preference fake key";
final String appLabel = "fake app label"; final String appLabel = "fake app label";
doReturn(1).when(mAppListGroup).getPreferenceCount(); doReturn(1).when(mAppListGroup).getPreferenceCount();
doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel(); 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( mBatteryChartPreferenceController.addPreferenceToScreen(
Arrays.asList(mBatteryDiffEntry)); Arrays.asList(mBatteryDiffEntry));
@@ -268,11 +268,11 @@ public final class BatteryChartPreferenceControllerTest {
// Verifies the preference cache. // Verifies the preference cache.
final PowerGaugePreference pref = final PowerGaugePreference pref =
(PowerGaugePreference) mBatteryChartPreferenceController.mPreferenceCache (PowerGaugePreference) mBatteryChartPreferenceController.mPreferenceCache
.get(prefKey); .get(PREF_KEY);
assertThat(pref).isNotNull(); assertThat(pref).isNotNull();
// Verifies the added preference configuration. // Verifies the added preference configuration.
verify(mAppListGroup).addPreference(pref); verify(mAppListGroup).addPreference(pref);
assertThat(pref.getKey()).isEqualTo(prefKey); assertThat(pref.getKey()).isEqualTo(PREF_KEY);
assertThat(pref.getTitle()).isEqualTo(appLabel); assertThat(pref.getTitle()).isEqualTo(appLabel);
assertThat(pref.getIcon()).isEqualTo(mDrawable); assertThat(pref.getIcon()).isEqualTo(mDrawable);
assertThat(pref.getOrder()).isEqualTo(1); assertThat(pref.getOrder()).isEqualTo(1);
@@ -280,6 +280,21 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(pref.isSingleLineTitle()).isTrue(); 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 @Test
public void testHandlePreferenceTreeClick_notPowerGaugePreference_returnFalse() { public void testHandlePreferenceTreeClick_notPowerGaugePreference_returnFalse() {
assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup)) assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup))
@@ -310,7 +325,7 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testSetPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() { public void testSetPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary("fake preference summary"); pref.setSummary(PREF_SUMMARY);
mBatteryChartPreferenceController.setPreferenceSummary( mBatteryChartPreferenceController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
@@ -322,7 +337,7 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testSetPreferenceSummary_setBackgroundUsageTimeOnly() { public void testSetPreferenceSummary_setBackgroundUsageTimeOnly() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary("fake preference summary"); pref.setSummary(PREF_SUMMARY);
mBatteryChartPreferenceController.setPreferenceSummary( mBatteryChartPreferenceController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
@@ -334,7 +349,7 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testSetPreferenceSummary_setTotalUsageTimeLessThanAMinute() { public void testSetPreferenceSummary_setTotalUsageTimeLessThanAMinute() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary("fake preference summary"); pref.setSummary(PREF_SUMMARY);
mBatteryChartPreferenceController.setPreferenceSummary( mBatteryChartPreferenceController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
@@ -346,7 +361,7 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testSetPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() { public void testSetPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary("fake preference summary"); pref.setSummary(PREF_SUMMARY);
mBatteryChartPreferenceController.setPreferenceSummary( mBatteryChartPreferenceController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
@@ -358,7 +373,7 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testSetPreferenceSummary_setTotalAndBackgroundUsageTime() { public void testSetPreferenceSummary_setTotalAndBackgroundUsageTime() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary("fake preference summary"); pref.setSummary(PREF_SUMMARY);
mBatteryChartPreferenceController.setPreferenceSummary( mBatteryChartPreferenceController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
@@ -370,7 +385,7 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testSetPreferenceSummary_notAllowShownPackage_setSummayAsNull() { public void testSetPreferenceSummary_notAllowShownPackage_setSummayAsNull() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary("fake preference summary"); pref.setSummary(PREF_SUMMARY);
final BatteryDiffEntry batteryDiffEntry = final BatteryDiffEntry batteryDiffEntry =
spy(createBatteryDiffEntry( spy(createBatteryDiffEntry(
/*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
@@ -436,33 +451,31 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void testOnExpand_expandedIsTrue_addSystemEntriesToPreferenceGroup() { public void testOnExpand_expandedIsTrue_addSystemEntriesToPreferenceGroup() {
final String prefKey = "preference_key";
doReturn(1).when(mAppListGroup).getPreferenceCount(); doReturn(1).when(mAppListGroup).getPreferenceCount();
mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry); mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry);
doReturn("label").when(mBatteryDiffEntry).getAppLabel(); doReturn("label").when(mBatteryDiffEntry).getAppLabel();
doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
doReturn(prefKey).when(mBatteryHistEntry).getKey(); doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ true); mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ true);
final ArgumentCaptor<Preference> captor = ArgumentCaptor.forClass(Preference.class); final ArgumentCaptor<Preference> captor = ArgumentCaptor.forClass(Preference.class);
verify(mAppListGroup).addPreference(captor.capture()); verify(mAppListGroup).addPreference(captor.capture());
// Verifies the added preference. // Verifies the added preference.
assertThat(captor.getValue().getKey()).isEqualTo(prefKey); assertThat(captor.getValue().getKey()).isEqualTo(PREF_KEY);
} }
@Test @Test
public void testOnExpand_expandedIsFalse_removeSystemEntriesFromPreferenceGroup() { public void testOnExpand_expandedIsFalse_removeSystemEntriesFromPreferenceGroup() {
final String prefKey = "preference_key"; doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
doReturn(prefKey).when(mBatteryHistEntry).getKey(); doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY);
doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(prefKey);
mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry); mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry);
// Verifies the cache is empty first. // Verifies the cache is empty first.
assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty(); assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ false); mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ false);
verify(mAppListGroup).findPreference(prefKey); verify(mAppListGroup).findPreference(PREF_KEY);
verify(mAppListGroup).removePreference(mPowerGaugePreference); verify(mAppListGroup).removePreference(mPowerGaugePreference);
assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1); assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1);
} }