Loading src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java +28 −2 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; Loading @@ -52,6 +53,8 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Calendar; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** Controls the update for chart graph and the list items. */ /** Controls the update for chart graph and the list items. */ public class BatteryChartPreferenceController extends AbstractPreferenceController public class BatteryChartPreferenceController extends AbstractPreferenceController Loading Loading @@ -136,11 +139,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private final SettingsActivity mActivity; private final SettingsActivity mActivity; private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider; private final PowerUsageFeatureProvider mPowerUsageFeatureProvider; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Handler mHandler = new Handler(Looper.getMainLooper()); private final AnimatorListenerAdapter mHourlyChartFadeInAdapter = private final AnimatorListenerAdapter mHourlyChartFadeInAdapter = createHourlyChartAnimatorListenerAdapter(/*visible=*/ true); createHourlyChartAnimatorListenerAdapter(/*visible=*/ true); private final AnimatorListenerAdapter mHourlyChartFadeOutAdapter = private final AnimatorListenerAdapter mHourlyChartFadeOutAdapter = createHourlyChartAnimatorListenerAdapter(/*visible=*/ false); createHourlyChartAnimatorListenerAdapter(/*visible=*/ false); private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); @VisibleForTesting @VisibleForTesting final DailyChartLabelTextGenerator mDailyChartLabelTextGenerator = final DailyChartLabelTextGenerator mDailyChartLabelTextGenerator = Loading @@ -156,6 +161,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mIs24HourFormat = DateFormat.is24HourFormat(context); mIs24HourFormat = DateFormat.is24HourFormat(context); mMetricsFeatureProvider = mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); mPowerUsageFeatureProvider = FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider(); if (lifecycle != null) { if (lifecycle != null) { lifecycle.addObserver(this); lifecycle.addObserver(this); } } Loading Loading @@ -364,13 +371,32 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll slotUsageData, getSlotInformation(), isBatteryUsageMapNullOrEmpty()); slotUsageData, getSlotInformation(), isBatteryUsageMapNullOrEmpty()); if (mOnBatteryTipsUpdatedListener != null) { if (mOnBatteryTipsUpdatedListener != null) { // TODO: replace with a selected powerAnomalyEvent with highest score mExecutor.execute(() -> { mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(null); final PowerAnomalyEventList anomalyEventList = mPowerUsageFeatureProvider .detectSettingsAnomaly(mContext, /* displayDrain= */ 0); final PowerAnomalyEvent displayEvent = getHighestScoreAnomalyEvent(anomalyEventList); mHandler.post(() -> mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(displayEvent)); }); } } } } return true; return true; } } private PowerAnomalyEvent getHighestScoreAnomalyEvent(PowerAnomalyEventList anomalyEventList) { if (anomalyEventList == null || anomalyEventList.getPowerAnomalyEventsCount() == 0) { return null; } PowerAnomalyEvent highestScoreEvent = null; for (PowerAnomalyEvent event : anomalyEventList.getPowerAnomalyEventsList()) { if (highestScoreEvent == null || event.getScore() > highestScoreEvent.getScore()) { highestScoreEvent = event; } } return highestScoreEvent; } private boolean refreshUiWithNoLevelDataCase() { private boolean refreshUiWithNoLevelDataCase() { setChartSummaryVisible(false); setChartSummaryVisible(false); if (mBatteryUsageMap == null) { if (mBatteryUsageMap == null) { Loading tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java +40 −0 Original line number Original line Diff line number Diff line Loading @@ -18,15 +18,30 @@ package com.android.settings.fuelgauge.batteryusage; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Context; import android.content.Intent; import android.view.View; import com.android.settings.R; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.display.AutoBrightnessSettings; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.testutils.BatteryTestUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import org.junit.Before; import org.junit.Before; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment; Loading @@ -36,13 +51,19 @@ public final class BatteryTipsCardPreferenceTest { private Context mContext; private Context mContext; private BatteryTipsCardPreference mBatteryTipsCardPreference; private BatteryTipsCardPreference mBatteryTipsCardPreference; private BatteryTipsController mBatteryTipsController; private BatteryTipsController mBatteryTipsController; @Mock private View mFakeView; @Mock private PowerUsageFeatureProvider mPowerUsageFeatureProvider; @Before @Before public void setUp() { public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application); mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null); mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null); mBatteryTipsController = new BatteryTipsController(mContext); mBatteryTipsController = new BatteryTipsController(mContext); mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference; mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference; mBatteryTipsController.mPowerUsageFeatureProvider = mPowerUsageFeatureProvider; } } @Test @Test Loading @@ -50,4 +71,23 @@ public final class BatteryTipsCardPreferenceTest { assertThat(mBatteryTipsCardPreference.getLayoutResource()).isEqualTo( assertThat(mBatteryTipsCardPreference.getLayoutResource()).isEqualTo( R.layout.battery_tips_card); R.layout.battery_tips_card); } } @Test public void onClick_actionBtn_getAdaptiveBrightnessLauncher() { final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); PowerAnomalyEvent adaptiveBrightnessAnomaly = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent(); when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true); when(mFakeView.getId()).thenReturn(R.id.main_button); doNothing().when(mContext).startActivity(captor.capture()); mBatteryTipsController.handleBatteryTipsCardUpdated(adaptiveBrightnessAnomaly); mBatteryTipsCardPreference.onClick(mFakeView); verify(mContext).startActivity(any(Intent.class)); final Intent intent = captor.getValue(); assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) .isEqualTo(AutoBrightnessSettings.class.getName()); assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1)) .isEqualTo(SettingsEnums.SETTINGS_AUTO_BRIGHTNESS); } } } Loading
src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java +28 −2 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; Loading @@ -52,6 +53,8 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Calendar; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** Controls the update for chart graph and the list items. */ /** Controls the update for chart graph and the list items. */ public class BatteryChartPreferenceController extends AbstractPreferenceController public class BatteryChartPreferenceController extends AbstractPreferenceController Loading Loading @@ -136,11 +139,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private final SettingsActivity mActivity; private final SettingsActivity mActivity; private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider; private final PowerUsageFeatureProvider mPowerUsageFeatureProvider; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Handler mHandler = new Handler(Looper.getMainLooper()); private final AnimatorListenerAdapter mHourlyChartFadeInAdapter = private final AnimatorListenerAdapter mHourlyChartFadeInAdapter = createHourlyChartAnimatorListenerAdapter(/*visible=*/ true); createHourlyChartAnimatorListenerAdapter(/*visible=*/ true); private final AnimatorListenerAdapter mHourlyChartFadeOutAdapter = private final AnimatorListenerAdapter mHourlyChartFadeOutAdapter = createHourlyChartAnimatorListenerAdapter(/*visible=*/ false); createHourlyChartAnimatorListenerAdapter(/*visible=*/ false); private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); @VisibleForTesting @VisibleForTesting final DailyChartLabelTextGenerator mDailyChartLabelTextGenerator = final DailyChartLabelTextGenerator mDailyChartLabelTextGenerator = Loading @@ -156,6 +161,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mIs24HourFormat = DateFormat.is24HourFormat(context); mIs24HourFormat = DateFormat.is24HourFormat(context); mMetricsFeatureProvider = mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); mPowerUsageFeatureProvider = FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider(); if (lifecycle != null) { if (lifecycle != null) { lifecycle.addObserver(this); lifecycle.addObserver(this); } } Loading Loading @@ -364,13 +371,32 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll slotUsageData, getSlotInformation(), isBatteryUsageMapNullOrEmpty()); slotUsageData, getSlotInformation(), isBatteryUsageMapNullOrEmpty()); if (mOnBatteryTipsUpdatedListener != null) { if (mOnBatteryTipsUpdatedListener != null) { // TODO: replace with a selected powerAnomalyEvent with highest score mExecutor.execute(() -> { mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(null); final PowerAnomalyEventList anomalyEventList = mPowerUsageFeatureProvider .detectSettingsAnomaly(mContext, /* displayDrain= */ 0); final PowerAnomalyEvent displayEvent = getHighestScoreAnomalyEvent(anomalyEventList); mHandler.post(() -> mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(displayEvent)); }); } } } } return true; return true; } } private PowerAnomalyEvent getHighestScoreAnomalyEvent(PowerAnomalyEventList anomalyEventList) { if (anomalyEventList == null || anomalyEventList.getPowerAnomalyEventsCount() == 0) { return null; } PowerAnomalyEvent highestScoreEvent = null; for (PowerAnomalyEvent event : anomalyEventList.getPowerAnomalyEventsList()) { if (highestScoreEvent == null || event.getScore() > highestScoreEvent.getScore()) { highestScoreEvent = event; } } return highestScoreEvent; } private boolean refreshUiWithNoLevelDataCase() { private boolean refreshUiWithNoLevelDataCase() { setChartSummaryVisible(false); setChartSummaryVisible(false); if (mBatteryUsageMap == null) { if (mBatteryUsageMap == null) { Loading
tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java +40 −0 Original line number Original line Diff line number Diff line Loading @@ -18,15 +18,30 @@ package com.android.settings.fuelgauge.batteryusage; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Context; import android.content.Intent; import android.view.View; import com.android.settings.R; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.display.AutoBrightnessSettings; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.testutils.BatteryTestUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import org.junit.Before; import org.junit.Before; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment; Loading @@ -36,13 +51,19 @@ public final class BatteryTipsCardPreferenceTest { private Context mContext; private Context mContext; private BatteryTipsCardPreference mBatteryTipsCardPreference; private BatteryTipsCardPreference mBatteryTipsCardPreference; private BatteryTipsController mBatteryTipsController; private BatteryTipsController mBatteryTipsController; @Mock private View mFakeView; @Mock private PowerUsageFeatureProvider mPowerUsageFeatureProvider; @Before @Before public void setUp() { public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application); mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null); mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null); mBatteryTipsController = new BatteryTipsController(mContext); mBatteryTipsController = new BatteryTipsController(mContext); mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference; mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference; mBatteryTipsController.mPowerUsageFeatureProvider = mPowerUsageFeatureProvider; } } @Test @Test Loading @@ -50,4 +71,23 @@ public final class BatteryTipsCardPreferenceTest { assertThat(mBatteryTipsCardPreference.getLayoutResource()).isEqualTo( assertThat(mBatteryTipsCardPreference.getLayoutResource()).isEqualTo( R.layout.battery_tips_card); R.layout.battery_tips_card); } } @Test public void onClick_actionBtn_getAdaptiveBrightnessLauncher() { final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); PowerAnomalyEvent adaptiveBrightnessAnomaly = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent(); when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true); when(mFakeView.getId()).thenReturn(R.id.main_button); doNothing().when(mContext).startActivity(captor.capture()); mBatteryTipsController.handleBatteryTipsCardUpdated(adaptiveBrightnessAnomaly); mBatteryTipsCardPreference.onClick(mFakeView); verify(mContext).startActivity(any(Intent.class)); final Intent intent = captor.getValue(); assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) .isEqualTo(AutoBrightnessSettings.class.getName()); assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1)) .isEqualTo(SettingsEnums.SETTINGS_AUTO_BRIGHTNESS); } } }