From 5a783d08158ec6341917c370bf2b34280bf3c01b Mon Sep 17 00:00:00 2001 From: ykhung Date: Wed, 12 May 2021 14:26:30 +0800 Subject: [PATCH] Clear static icon and label cache if ui mode is changed we should clear icon cache if theme is changed between light and dark theme, otherwise we may show incorrect styled icon for applications Bug: 185187729 Test: make SettingsRoboTests Change-Id: Ib06abe5a5345b2ea363a04ecaec886a4765fd8ab --- .../BatteryChartPreferenceController.java | 18 ++++++++++- .../BatteryChartPreferenceControllerTest.java | 31 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java index f75094d2ffa..1b5c7795022 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge; import android.content.Context; +import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; @@ -39,6 +40,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnCreate; import com.android.settingslib.core.lifecycle.events.OnDestroy; +import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState; import com.android.settingslib.utils.StringUtil; @@ -53,7 +55,7 @@ import java.util.Map; /** Controls the update for chart graph and the list items. */ public class BatteryChartPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin, LifecycleObserver, OnCreate, OnDestroy, - OnSaveInstanceState, BatteryChartView.OnSelectListener, + OnSaveInstanceState, BatteryChartView.OnSelectListener, OnResume, ExpandDividerPreference.OnExpandListener { private static final String TAG = "BatteryChartPreferenceController"; /** Desired battery history size for timestamp slots. */ @@ -67,6 +69,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private static final String KEY_EXPAND_SYSTEM_INFO = "expand_system_info"; private static final String KEY_CURRENT_TIME_SLOT = "current_time_slot"; + private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; + @VisibleForTesting Map> mBatteryIndexedMap; @@ -124,6 +128,18 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mTrapezoidIndex, mIsExpanded)); } + @Override + public void onResume() { + final int currentUiMode = + mContext.getResources().getConfiguration().uiMode + & Configuration.UI_MODE_NIGHT_MASK; + if (sUiMode != currentUiMode) { + sUiMode = currentUiMode; + BatteryDiffEntry.clearCache(); + Log.d(TAG, "clear icon and label cache since uiMode is changed"); + } + } + @Override public void onSaveInstanceState(Bundle savedInstance) { if (savedInstance == null) { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index f6a2ed15dfe..a0a1417056b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -29,6 +29,8 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.ContentValues; import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.format.DateUtils; @@ -76,6 +78,8 @@ public final class BatteryChartPreferenceControllerTest { @Mock private PowerGaugePreference mPowerGaugePreference; @Mock private ExpandDividerPreference mExpandDividerPreference; @Mock private BatteryUtils mBatteryUtils; + @Mock private Configuration mConfiguration; + @Mock private Resources mResources; private Context mContext; private BatteryDiffEntry mBatteryDiffEntry; @@ -104,6 +108,33 @@ public final class BatteryChartPreferenceControllerTest { createBatteryHistoryMap()); } + @Test + public void testOnResume_uiModeIsChanged_clearBatteryDiffEntryCache() { + doReturn(mResources).when(mContext).getResources(); + doReturn(mConfiguration).when(mResources).getConfiguration(); + mConfiguration.uiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; + // Ensures the testing environment is correct. + assertThat(BatteryDiffEntry.sResourceCache).hasSize(1); + mBatteryChartPreferenceController.onResume(); + // Changes the uiMode in the configuration. + mConfiguration.uiMode = Configuration.UI_MODE_NIGHT_YES; + + mBatteryChartPreferenceController.onResume(); + assertThat(BatteryDiffEntry.sResourceCache).isEmpty(); + } + + @Test + public void testOnResume_uiModeIsNotChanged_notClearBatteryDiffEntryCache() { + doReturn(mResources).when(mContext).getResources(); + doReturn(mConfiguration).when(mResources).getConfiguration(); + mConfiguration.uiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; + // Ensures the testing environment is correct. + assertThat(BatteryDiffEntry.sResourceCache).hasSize(1); + + mBatteryChartPreferenceController.onResume(); + assertThat(BatteryDiffEntry.sResourceCache).isNotEmpty(); + } + @Test public void testOnDestroy_activityIsChanging_clearBatteryEntryCache() { doReturn(true).when(mSettingsActivity).isChangingConfigurations();