Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c23d659 authored by ykhung's avatar ykhung
Browse files

Avoid add preferenc again if it already in the PreferenceGroup

Bug: 177406865
Bug: 185187729
Test: make SettingsRoboTests
Test: make SettingsGoogleRoboTests
Change-Id: I69f5033c0a07d846c340b9871e69a2cdbe0bb2aa
parent 09f6086b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -443,7 +443,7 @@
    <!-- Battery usage chart view component -->
    <dimen name="chartview_divider_width">1dp</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_bottom">2dp</dimen>
</resources>
+11 −3
Original line number Diff line number Diff line
@@ -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);
            if (!isAdded) {
                mAppListPrefGroup.addPreference(pref);
            }
            prefIndex++;
        }
    }
+11 −1
Original line number Diff line number Diff line
@@ -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. */
+18 −0
Original line number Diff line number Diff line
@@ -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<Integer, List<BatteryDiffEntry>> getIndexedUsageMap(
            final Context context,
+35 −22
Original line number Diff line number Diff line
@@ -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<Preference> 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);
    }