From f4dc70ae3702fc0941da97fc87835b151c68cf10 Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Mon, 7 Aug 2023 18:21:13 +0800 Subject: [PATCH 1/4] Updated PowerAnomalyEvent Proto. - Add repeated fields. - Add unique id. - Updated main_button action arguments. Test: manual Bug: 291689623 Change-Id: Id9fa88d6df0db50472732e4a50aa00a7a02db284 Merged-In: Id9fa88d6df0db50472732e4a50aa00a7a02db284 --- .../protos/power_anomaly_event.proto | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto index b4277c4bcc6..380c786e9c4 100644 --- a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto +++ b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto @@ -4,14 +4,19 @@ option java_multiple_files = true; option java_package = "com.android.settings.fuelgauge.batteryusage"; option java_outer_classname = "PowerAnomalyEventProto"; +message PowerAnomalyEventList { + repeated PowerAnomalyEvent power_anomaly_events = 1; +} + message PowerAnomalyEvent { - optional int64 timestamp = 1; - optional string type = 2; // e.g. settings, apps - optional string key = 3; // e.g. brightness, significant_increase - optional float score = 4; + optional string event_id = 1; + optional int64 timestamp = 2; + optional string type = 3; // e.g. settings, apps + optional string key = 4; // e.g. brightness, significant_increase + optional float score = 5; oneof info { - WarningBannerInfo warning_banner_info = 5; - WarningItemInfo warning_item_info = 6; + WarningBannerInfo warning_banner_info = 6; + WarningItemInfo warning_item_info = 7; } } @@ -19,9 +24,11 @@ message WarningBannerInfo { optional string title_string = 1; optional string description_string = 2; optional string main_button_string = 3; - optional string main_button_action = 4; - optional string cancel_button_string = 5; - optional string cancel_button_action = 6; + // Used in the SubSettingLauncher.setDestination(). + optional string main_button_destination = 4; + // Used in the SubSettingLauncher.setSourceMetricsCategory(). + optional int32 main_button_source_metrics_category = 5; + optional string cancel_button_string = 6; } message WarningItemInfo { @@ -31,7 +38,9 @@ message WarningItemInfo { optional string title_string = 4; optional string description_string = 5; optional string main_button_string = 6; - optional string main_button_action = 7; - optional string cancel_button_string = 8; - optional string cancel_button_action = 9; + // Used in the SubSettingLauncher.setDestination(). + optional string main_button_destination = 7; + // Used in the SubSettingLauncher.setSourceMetricsCategory(). + optional int32 main_button_source_metrics_category = 8; + optional string cancel_button_string = 9; } From 2148988cae4bb95df09efbcb41325c0d2f304a61 Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Wed, 26 Jul 2023 15:21:08 +0800 Subject: [PATCH 2/4] Improve battery tips cards. - Updated Card UI - Set thumb-up/down feedback preference to be GONE - Add basic button action [Screenshots] https://screenshot.googleplex.com/925MEzRyUCxZCi8 Test: manual Change-Id: I356648d0fcec5dd1ea724297187ecafb5be55fd8 Merged-In: I356648d0fcec5dd1ea724297187ecafb5be55fd8 Bug: 291689623 --- .../battery_tips_all_rounded_bg_ripple.xml | 21 +++ res/layout/battery_tips_card.xml | 82 +++++----- res/values/arrays.xml | 21 +++ res/values/strings.xml | 17 +- .../PowerUsageFeatureProviderImpl.java | 2 +- .../BatteryChartPreferenceController.java | 8 +- .../BatteryTipsCardPreference.java | 87 +++++++--- .../batteryusage/BatteryTipsController.java | 116 +++++++++++--- .../PowerUsageFeatureProviderImplTest.java | 4 +- .../BatteryTipsCardPreferenceTest.java | 3 + .../BatteryTipsControllerTest.java | 149 ++++++++++++++++++ .../settings/testutils/BatteryTestUtils.java | 36 +++++ 12 files changed, 434 insertions(+), 112 deletions(-) create mode 100644 res/drawable/battery_tips_all_rounded_bg_ripple.xml create mode 100644 tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java diff --git a/res/drawable/battery_tips_all_rounded_bg_ripple.xml b/res/drawable/battery_tips_all_rounded_bg_ripple.xml new file mode 100644 index 00000000000..31805704b3b --- /dev/null +++ b/res/drawable/battery_tips_all_rounded_bg_ripple.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/res/layout/battery_tips_card.xml b/res/layout/battery_tips_card.xml index d2edb51c0ab..2fa5bf2ae4c 100644 --- a/res/layout/battery_tips_card.xml +++ b/res/layout/battery_tips_card.xml @@ -12,36 +12,16 @@ android:id="@+id/tips_card" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/battery_tips_all_rounded_bg" + android:background="@drawable/battery_tips_all_rounded_bg_ripple" android:orientation="vertical" android:padding="24dp"> - - - - - - - - + android:layout_gravity="center_vertical|start" + android:src="@drawable/ic_battery_tips_lightbulb" /> - + android:gravity="end"> - + + + + + + + adaptive_brightness + screen_timeout + + + + Turn on adaptive brightness to extend battery life + Reduce screen timeout to extend battery life + + + + @string/battery_tips_card_action_button + @string/battery_tips_card_action_button + + + + @string/battery_tips_card_dismiss_button + @string/battery_tips_card_dismiss_button + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 040a91ed7cb..04901fb05dd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9651,23 +9651,14 @@ Set battery usage for apps - Optimize + View Settings + + + Got it Is this message helpful? - - Turn on adaptive brightness to extend battery life - - - It will help reduce your daily battery drain by 10% - - - Reduce screen timeout to extend battery life - - - It will help reduce your daily battery drain by 10% - Unrestricted diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index 9b5bb5e47c6..ed9751834ce 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -82,7 +82,7 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider @Override public boolean isBatteryTipsFeedbackEnabled() { - return true; + return false; } @Override diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java index b7e1885ce52..3231e55ccee 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java @@ -105,10 +105,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll public interface OnBatteryTipsUpdatedListener { /** * The callback function for the battery tips card is updated. - * @param title the title of the battery tip card - * @param summary the summary of the battery tip card + * @param powerAnomalyEvent the power anomaly event with highest score */ - void onBatteryTipsUpdated(String title, String summary); + void onBatteryTipsUpdated(PowerAnomalyEvent powerAnomalyEvent); } @@ -365,7 +364,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll slotUsageData, getSlotInformation(), isBatteryUsageMapNullOrEmpty()); if (mOnBatteryTipsUpdatedListener != null) { - mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(null, null); + // TODO: replace with a selected powerAnomalyEvent with highest score + mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(null); } } return true; diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java index 661d7c8aca3..f59f2e2c73d 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java @@ -17,15 +17,19 @@ package com.android.settings.fuelgauge.batteryusage; import android.content.Context; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.ImageButton; +import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import com.android.settings.R; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; @@ -40,12 +44,14 @@ public class BatteryTipsCardPreference extends Preference implements View.OnClic private final PowerUsageFeatureProvider mPowerUsageFeatureProvider; - private MaterialButton mActionButton; - private ImageButton mDismissButton; - private ImageButton mThumbUpButton; - private ImageButton mThumbDownButton; - private CharSequence mTitle; - private CharSequence mSummary; + @VisibleForTesting + CharSequence mMainButtonLabel; + @VisibleForTesting + CharSequence mDismissButtonLabel; + @VisibleForTesting + String mDestinationComponentName; + @VisibleForTesting + int mSourceMetricsCategory; public BatteryTipsCardPreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -55,34 +61,65 @@ public class BatteryTipsCardPreference extends Preference implements View.OnClic .getPowerUsageFeatureProvider(context); } - @Override - public void setTitle(CharSequence title) { - mTitle = title; - notifyChanged(); + /** + * Update the label of main button in tips card. + */ + public void setMainButtonLabel(CharSequence label) { + if (!TextUtils.equals(mMainButtonLabel, label)) { + mMainButtonLabel = label; + notifyChanged(); + } } - @Override - public void setSummary(CharSequence summary) { - mSummary = summary; - notifyChanged(); + /** + * Update the label of dismiss button in tips card. + */ + public void setDismissButtonLabel(CharSequence label) { + if (!TextUtils.equals(mDismissButtonLabel, label)) { + mDismissButtonLabel = label; + notifyChanged(); + } + } + + /** + * Update the info of target fragment launched by main button. + */ + public void setMainButtonLauncherInfo(final String destinationClassName, + final Integer sourceMetricsCategory) { + mDestinationComponentName = destinationClassName; + mSourceMetricsCategory = sourceMetricsCategory; } @Override public void onClick(View view) { - // TODO: replace with the settings anomaly obtained from detectSettingsAnomaly(); + final int viewId = view.getId(); + if (viewId == R.id.main_button || viewId == R.id.tips_card) { + if (TextUtils.isEmpty(mDestinationComponentName)) { + return; + } + new SubSettingLauncher(getContext()) + .setDestination(mDestinationComponentName) + .setSourceMetricsCategory(mSourceMetricsCategory) + .launch(); + } else if (viewId == R.id.dismiss_button) { + setVisible(false); + } } @Override public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); - ((TextView) view.findViewById(R.id.title)).setText(mTitle); - ((TextView) view.findViewById(R.id.summary)).setText(mSummary); + ((TextView) view.findViewById(R.id.title)).setText(getTitle()); - mActionButton = (MaterialButton) view.findViewById(R.id.action_button); - mActionButton.setOnClickListener(this); - mDismissButton = (ImageButton) view.findViewById(R.id.dismiss_button); - mDismissButton.setOnClickListener(this); + LinearLayout tipsCard = (LinearLayout) view.findViewById(R.id.tips_card); + tipsCard.setOnClickListener(this); + MaterialButton mainButton = (MaterialButton) view.findViewById(R.id.main_button); + mainButton.setOnClickListener(this); + mainButton.setText(mMainButtonLabel); + MaterialButton dismissButton = (MaterialButton) view.findViewById(R.id.dismiss_button); + dismissButton.setOnClickListener(this); + dismissButton.setText(mDismissButtonLabel); if (!mPowerUsageFeatureProvider.isBatteryTipsFeedbackEnabled()) { return; @@ -91,9 +128,9 @@ public class BatteryTipsCardPreference extends Preference implements View.OnClic .setBackgroundResource(R.drawable.battery_tips_half_rounded_top_bg); view.findViewById(R.id.feedback_card).setVisibility(View.VISIBLE); - mThumbUpButton = (ImageButton) view.findViewById(R.id.thumb_up); - mThumbUpButton.setOnClickListener(this); - mThumbDownButton = (ImageButton) view.findViewById(R.id.thumb_down); - mThumbDownButton.setOnClickListener(this); + ImageButton thumbUpButton = (ImageButton) view.findViewById(R.id.thumb_up); + thumbUpButton.setOnClickListener(this); + ImageButton thumbDownButton = (ImageButton) view.findViewById(R.id.thumb_down); + thumbDownButton.setOnClickListener(this); } } diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java index bcedd4f5794..991a8f66eb7 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java @@ -17,13 +17,18 @@ package com.android.settings.fuelgauge.batteryusage; import android.content.Context; +import android.text.TextUtils; import androidx.preference.PreferenceScreen; +import com.android.internal.annotations.VisibleForTesting; +import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; +import java.util.function.Function; + /** Controls the update for battery tips card */ public class BatteryTipsController extends BasePreferenceController { @@ -31,15 +36,23 @@ public class BatteryTipsController extends BasePreferenceController { private static final String ROOT_PREFERENCE_KEY = "battery_tips_category"; private static final String CARD_PREFERENCE_KEY = "battery_tips_card"; - private final PowerUsageFeatureProvider mPowerUsageFeatureProvider; + private final String[] mPowerAnomalyKeys; - private Context mPrefContext; - private BatteryTipsCardPreference mCardPreference; + @VisibleForTesting + BatteryTipsCardPreference mCardPreference; + @VisibleForTesting + PowerUsageFeatureProvider mPowerUsageFeatureProvider; public BatteryTipsController(Context context) { super(context, ROOT_PREFERENCE_KEY); mPowerUsageFeatureProvider = FeatureFactory.getFactory(context) .getPowerUsageFeatureProvider(context); + mPowerAnomalyKeys = context.getResources().getStringArray(R.array.power_anomaly_keys); + } + + private boolean isTipsCardVisible() { + // TODO: compared with the timestamp of last user dismiss action in sharedPreference. + return mPowerUsageFeatureProvider.isBatteryTipsEnabled(); } @Override @@ -50,28 +63,89 @@ public class BatteryTipsController extends BasePreferenceController { @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - mPrefContext = screen.getContext(); mCardPreference = screen.findPreference(CARD_PREFERENCE_KEY); } - /** - * Update the card visibility and contents. - * @param title a string not extend 2 lines. - * @param summary a string not extend 10 lines. - */ - // TODO: replace parameters with SettingsAnomaly Data Proto - public void handleBatteryTipsCardUpdated(String title, String summary) { - if (!mPowerUsageFeatureProvider.isBatteryTipsEnabled()) { - mCardPreference.setVisible(false); - return; + @VisibleForTesting + int getPowerAnomalyEventIndex(String powerAnomalyKey) { + for (int index = 0; index < mPowerAnomalyKeys.length; index++) { + if (mPowerAnomalyKeys[index].equals(powerAnomalyKey)) { + return index; + } } - if (title == null || summary == null) { - mCardPreference.setVisible(false); - return; - } - mCardPreference.setTitle(title); - mCardPreference.setSummary(summary); - mCardPreference.setVisible(true); + return -1; } + private T getInfo(PowerAnomalyEvent powerAnomalyEvent, + Function warningBannerInfoSupplier, + Function warningItemInfoSupplier) { + if (powerAnomalyEvent.hasWarningBannerInfo() && warningBannerInfoSupplier != null) { + return warningBannerInfoSupplier.apply(powerAnomalyEvent.getWarningBannerInfo()); + } else if (powerAnomalyEvent.hasWarningItemInfo() && warningItemInfoSupplier != null) { + return warningItemInfoSupplier.apply(powerAnomalyEvent.getWarningItemInfo()); + } + return null; + } + + private String getString(PowerAnomalyEvent powerAnomalyEvent, + Function warningBannerInfoSupplier, + Function warningItemInfoSupplier, + int resourceId, int resourceIndex) { + String string = + getInfo(powerAnomalyEvent, warningBannerInfoSupplier, warningItemInfoSupplier); + + if (!TextUtils.isEmpty(string) || resourceId < 0) { + return string; + } + + if (resourceIndex >= 0) { + string = mContext.getResources().getStringArray(resourceId)[resourceIndex]; + } + + return string; + } + + @VisibleForTesting + void handleBatteryTipsCardUpdated(PowerAnomalyEvent powerAnomalyEvent) { + if (!isTipsCardVisible()) { + mCardPreference.setVisible(false); + return; + } + if (powerAnomalyEvent == null) { + mCardPreference.setVisible(false); + return; + } + + // Get card preference strings and navigate fragment info + final int index = getPowerAnomalyEventIndex(powerAnomalyEvent.getKey()); + + String titleString = getString(powerAnomalyEvent, WarningBannerInfo::getTitleString, + WarningItemInfo::getTitleString, R.array.power_anomaly_titles, index); + if (titleString.isEmpty()) { + mCardPreference.setVisible(false); + return; + } + + String mainBtnString = getString(powerAnomalyEvent, + WarningBannerInfo::getMainButtonString, WarningItemInfo::getMainButtonString, + R.array.power_anomaly_main_btn_strings, index); + String dismissBtnString = getString(powerAnomalyEvent, + WarningBannerInfo::getCancelButtonString, WarningItemInfo::getCancelButtonString, + R.array.power_anomaly_dismiss_btn_strings, index); + + String destinationClassName = getString(powerAnomalyEvent, + WarningBannerInfo::getMainButtonDestination, + WarningItemInfo::getMainButtonDestination, + -1, -1); + Integer sourceMetricsCategory = getInfo(powerAnomalyEvent, + WarningBannerInfo::getMainButtonSourceMetricsCategory, + WarningItemInfo::getMainButtonSourceMetricsCategory); + + // Updated card preference and main button fragment launcher + mCardPreference.setTitle(titleString); + mCardPreference.setMainButtonLabel(mainBtnString); + mCardPreference.setDismissButtonLabel(dismissBtnString); + mCardPreference.setMainButtonLauncherInfo(destinationClassName, sourceMetricsCategory); + mCardPreference.setVisible(true); + } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java index c9591a51b08..bf4e8938f88 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java @@ -73,8 +73,8 @@ public class PowerUsageFeatureProviderImplTest { } @Test - public void testIsBatteryTipsFeedbackEnabled_returnTrue() { - assertThat(mPowerFeatureProvider.isBatteryTipsFeedbackEnabled()).isTrue(); + public void testIsBatteryTipsFeedbackEnabled_returnFalse() { + assertThat(mPowerFeatureProvider.isBatteryTipsFeedbackEnabled()).isFalse(); } @Test public void testGetBatteryUsageListConsumePowerThreshold_return0() { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java index 6f9a47416ae..bc787f1af0a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java @@ -35,11 +35,14 @@ public final class BatteryTipsCardPreferenceTest { private Context mContext; private BatteryTipsCardPreference mBatteryTipsCardPreference; + private BatteryTipsController mBatteryTipsController; @Before public void setUp() { mContext = spy(RuntimeEnvironment.application); mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null); + mBatteryTipsController = new BatteryTipsController(mContext); + mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference; } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java new file mode 100644 index 00000000000..0c9a0b03a83 --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.fuelgauge.batteryusage; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; +import android.os.LocaleList; + +import com.android.settings.fuelgauge.PowerUsageFeatureProvider; +import com.android.settings.testutils.BatteryTestUtils; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import java.util.Locale; +import java.util.TimeZone; + +@RunWith(RobolectricTestRunner.class) +public final class BatteryTipsControllerTest { + + private Context mContext; + private BatteryTipsController mBatteryTipsController; + + @Mock + private BatteryTipsCardPreference mBatteryTipsCardPreference; + + @Mock + private PowerUsageFeatureProvider mPowerUsageFeatureProvider; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + Locale.setDefault(new Locale("en_US")); + org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + mContext = spy(RuntimeEnvironment.application); + final Resources resources = spy(mContext.getResources()); + resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US"))); + doReturn(resources).when(mContext).getResources(); + mBatteryTipsController = new BatteryTipsController(mContext); + mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference; + mBatteryTipsController.mPowerUsageFeatureProvider = mPowerUsageFeatureProvider; + } + + @Test + public void parsePowerAnomalyKey_preDefinedKeys_returnTrue() { + final String[] keys = {"adaptive_brightness", "screen_timeout"}; + for (int index = 0; index < keys.length; index++) { + assertThat(mBatteryTipsController.getPowerAnomalyEventIndex(keys[index])) + .isEqualTo(index); + } + } + + @Test + public void parsePowerAnomalyKey_unknownKey_returnTrue() { + final String key = "unknown_key_for_test"; + assertThat(mBatteryTipsController.getPowerAnomalyEventIndex(key)).isEqualTo(-1); + } + + @Test + public void handleBatteryTipsCardUpdated_null_hidePreference() { + mBatteryTipsController.handleBatteryTipsCardUpdated(/* powerAnomalyEvents= */ null); + + verify(mBatteryTipsCardPreference).setVisible(false); + } + + @Test + public void handleBatteryTipsCardUpdated_adaptiveBrightnessAnomaly_showAnomaly() { + PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent(); + when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true); + + mBatteryTipsController.handleBatteryTipsCardUpdated(event); + + // Check pre-defined string + verify(mBatteryTipsCardPreference).setTitle( + "Turn on adaptive brightness to extend battery life"); + verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings"); + verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it"); + // Check proto info + verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo( + "com.android.settings.display.AutoBrightnessSettings", + 1381); + verify(mBatteryTipsCardPreference).setVisible(true); + } + + @Test + public void handleBatteryTipsCardUpdated_screenTimeoutAnomaly_showAnomaly() { + PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent(); + when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true); + + mBatteryTipsController.handleBatteryTipsCardUpdated(event); + + verify(mBatteryTipsCardPreference).setTitle("Reduce screen timeout to extend battery life"); + verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings"); + verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it"); + verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo( + "com.android.settings.display.ScreenTimeoutSettings", + 1852); + verify(mBatteryTipsCardPreference).setVisible(true); + } + @Test + public void handleBatteryTipsCardUpdated_screenTimeoutAnomalyHasTitle_showAnomaly() { + PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent(); + String testTitle = "TestTitle"; + event = event.toBuilder() + .setWarningBannerInfo( + event.getWarningBannerInfo().toBuilder() + .setTitleString(testTitle) + .build()) + .build(); + when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true); + + mBatteryTipsController.handleBatteryTipsCardUpdated(event); + + verify(mBatteryTipsCardPreference).setTitle(testTitle); + verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings"); + verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it"); + verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo( + "com.android.settings.display.ScreenTimeoutSettings", + 1852); + verify(mBatteryTipsCardPreference).setVisible(true); + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java index c54b750cb55..e99b17f5084 100644 --- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java @@ -18,6 +18,7 @@ package com.android.settings.testutils; import static org.mockito.Mockito.when; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.hardware.usb.UsbManager; @@ -25,11 +26,17 @@ import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPortStatus; import android.os.BatteryManager; import android.os.UserManager; + import androidx.room.Room; +import com.android.settings.display.AutoBrightnessSettings; +import com.android.settings.display.ScreenTimeoutSettings; import com.android.settings.fuelgauge.batteryusage.BatteryInformation; import com.android.settings.fuelgauge.batteryusage.ConvertUtils; import com.android.settings.fuelgauge.batteryusage.DeviceBatteryState; +import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEvent; +import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEventList; +import com.android.settings.fuelgauge.batteryusage.WarningBannerInfo; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventDao; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; import com.android.settings.fuelgauge.batteryusage.db.BatteryState; @@ -193,4 +200,33 @@ public class BatteryTestUtils { when(mockUsbPortStatus.getComplianceWarnings()) .thenReturn(new int[]{UsbPortStatus.COMPLIANCE_WARNING_OTHER}); } + + /** Create an empty power anomaly event list proto. */ + public static PowerAnomalyEventList createEmptyPowerAnomalyEventList() { + return PowerAnomalyEventList.getDefaultInstance(); + } + + /** Create a power anomaly event proto of adaptive brightness. */ + public static PowerAnomalyEvent createAdaptiveBrightnessAnomalyEvent() { + return PowerAnomalyEvent.newBuilder() + .setType("settings banner") + .setKey("adaptive_brightness") + .setWarningBannerInfo(WarningBannerInfo.newBuilder() + .setMainButtonDestination(AutoBrightnessSettings.class.getName()) + .setMainButtonSourceMetricsCategory(SettingsEnums.SETTINGS_AUTO_BRIGHTNESS) + .build()) + .build(); + } + + /** Create a power anomaly event proto of screen timeout. */ + public static PowerAnomalyEvent createScreenTimeoutAnomalyEvent() { + return PowerAnomalyEvent.newBuilder() + .setType("settings banner") + .setKey("screen_timeout") + .setWarningBannerInfo(WarningBannerInfo.newBuilder() + .setMainButtonDestination(ScreenTimeoutSettings.class.getName()) + .setMainButtonSourceMetricsCategory(SettingsEnums.SCREEN_TIMEOUT) + .build()) + .build(); + } } From 20ec9893d2b8998fa5f101c80370426e1d9dc0fb Mon Sep 17 00:00:00 2001 From: Kuan Wang Date: Wed, 9 Aug 2023 11:35:37 +0800 Subject: [PATCH 3/4] Move static UsageStatsManager from DatabaseUtils to DataProcessor to avoid reference from DataProcessor. This is to fix the Accessibility tests hang issue. Tested on main branch (https://android-build.googleplex.com/builds/abtd/run/L40400000962473343). Test: make RunSettingsRoboTests Bug: 293366011 Bug: 295026588 Bug: 295123907 Change-Id: I345e0c060165e4d06f98ada6b2e1ca3cbb4f911a --- .../fuelgauge/batteryusage/ConvertUtils.java | 16 ++++++++----- .../fuelgauge/batteryusage/DataProcessor.java | 12 ++++++++-- .../fuelgauge/batteryusage/DatabaseUtils.java | 10 ++------ .../batteryusage/ConvertUtilsTest.java | 23 +++++++++++-------- .../batteryusage/DataProcessManagerTest.java | 2 +- .../batteryusage/DataProcessorTest.java | 2 +- .../batteryusage/DatabaseUtilsTest.java | 8 +++---- 7 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java index 3fc44ccfd9b..5fc4ad52b83 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge.batteryusage; import android.annotation.IntDef; import android.annotation.Nullable; +import android.app.usage.IUsageStatsManager; import android.app.usage.UsageEvents.Event; import android.app.usage.UsageStatsManager; import android.content.ContentValues; @@ -185,7 +186,8 @@ public final class ConvertUtils { /** Converts to {@link AppUsageEvent} from {@link Event} */ @Nullable public static AppUsageEvent convertToAppUsageEvent( - Context context, final Event event, final long userId) { + Context context, IUsageStatsManager usageStatsManager, final Event event, + final long userId) { final String packageName = event.getPackageName(); if (packageName == null) { // See b/190609174: Event package names should never be null, but sometimes they are. @@ -210,7 +212,8 @@ public final class ConvertUtils { } final String effectivePackageName = - getEffectivePackageName(context, packageName, taskRootPackageName); + getEffectivePackageName( + context, usageStatsManager, packageName, taskRootPackageName); try { final long uid = context .getPackageManager() @@ -326,8 +329,9 @@ public final class ConvertUtils { */ @VisibleForTesting static String getEffectivePackageName( - Context context, final String packageName, final String taskRootPackageName) { - final int usageSource = getUsageSource(context); + Context context, IUsageStatsManager usageStatsManager, final String packageName, + final String taskRootPackageName) { + final int usageSource = getUsageSource(context, usageStatsManager); switch (usageSource) { case UsageStatsManager.USAGE_SOURCE_TASK_ROOT_ACTIVITY: return !TextUtils.isEmpty(taskRootPackageName) @@ -372,9 +376,9 @@ public final class ConvertUtils { } } - private static int getUsageSource(Context context) { + private static int getUsageSource(Context context, IUsageStatsManager usageStatsManager) { if (sUsageSource == EMPTY_USAGE_SOURCE) { - sUsageSource = DatabaseUtils.getUsageSource(context); + sUsageSource = DatabaseUtils.getUsageSource(context, usageStatsManager); } return sUsageSource; } diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java index badc35935fa..620ae31c961 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java @@ -32,6 +32,7 @@ import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UidBatteryConsumer; import android.os.UserBatteryConsumer; import android.os.UserHandle; @@ -108,6 +109,11 @@ public final class DataProcessor { @VisibleForTesting static Set sTestSystemAppsPackageNames; + @VisibleForTesting + static IUsageStatsManager sUsageStatsManager = + IUsageStatsManager.Stub.asInterface( + ServiceManager.getService(Context.USAGE_STATS_SERVICE)); + public static final String CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER = "CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER"; @@ -338,7 +344,8 @@ public final class DataProcessor { break; } final AppUsageEvent appUsageEvent = - ConvertUtils.convertToAppUsageEvent(context, event, userId); + ConvertUtils.convertToAppUsageEvent( + context, sUsageStatsManager, event, userId); if (appUsageEvent != null) { numEventsFetched++; appUsageEventList.add(appUsageEvent); @@ -694,6 +701,7 @@ public final class DataProcessor { final long eventUserId = firstEvent.getUserId(); final String packageName = getEffectivePackageName( context, + sUsageStatsManager, firstEvent.getPackageName(), firstEvent.getTaskRootPackageName()); usageEvents.addAll(deviceEvents); @@ -966,7 +974,7 @@ public final class DataProcessor { final long startTime = DatabaseUtils.getAppUsageStartTimestampOfUser( context, userID, earliestTimestamp); return loadAppUsageEventsForUserFromService( - DatabaseUtils.sUsageStatsManager, startTime, now, userID, callingPackage); + sUsageStatsManager, startTime, now, userID, callingPackage); } @Nullable diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java index ea1f3ed9e79..b54563bd566 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java @@ -31,7 +31,6 @@ import android.os.BatteryUsageStats; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserManager; import android.util.Log; @@ -117,11 +116,6 @@ public final class DatabaseUtils { @VisibleForTesting static Supplier sFakeSupplier; - @VisibleForTesting - static IUsageStatsManager sUsageStatsManager = - IUsageStatsManager.Stub.asInterface( - ServiceManager.getService(Context.USAGE_STATS_SERVICE)); - private DatabaseUtils() { } @@ -488,7 +482,7 @@ public final class DatabaseUtils { * * @see UsageStatsManager#getUsageSource() */ - static int getUsageSource(Context context) { + static int getUsageSource(Context context, IUsageStatsManager usageStatsManager) { final SharedPreferences sharedPreferences = getSharedPreferences(context); if (sharedPreferences != null && sharedPreferences.contains(KEY_LAST_USAGE_SOURCE)) { return sharedPreferences @@ -497,7 +491,7 @@ public final class DatabaseUtils { int usageSource = ConvertUtils.DEFAULT_USAGE_SOURCE; try { - usageSource = sUsageStatsManager.getUsageSource(); + usageSource = usageStatsManager.getUsageSource(); } catch (RemoteException e) { Log.e(TAG, "Failed to getUsageSource", e); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java index 3cbe8a44d1f..e9108bc7efe 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java @@ -25,6 +25,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import android.app.usage.IUsageStatsManager; import android.app.usage.UsageEvents; import android.app.usage.UsageEvents.Event; import android.content.ContentValues; @@ -61,6 +62,8 @@ public final class ConvertUtilsTest { private BatteryUsageStats mBatteryUsageStats; @Mock private BatteryEntry mMockBatteryEntry; + @Mock + private IUsageStatsManager mUsageStatsManager; @Before public void setUp() { @@ -68,6 +71,7 @@ public final class ConvertUtilsTest { mContext = spy(RuntimeEnvironment.application); ConvertUtils.sUsageSource = ConvertUtils.EMPTY_USAGE_SOURCE; when(mContext.getPackageManager()).thenReturn(mMockPackageManager); + DataProcessor.sUsageStatsManager = mUsageStatsManager; } @Test @@ -299,7 +303,7 @@ public final class ConvertUtilsTest { final long userId = 2; final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent( - mContext, event, userId); + mContext, mUsageStatsManager, event, userId); assertThat(appUsageEvent.getTimestamp()).isEqualTo(101L); assertThat(appUsageEvent.getType()).isEqualTo(AppUsageEventType.ACTIVITY_RESUMED); assertThat(appUsageEvent.getPackageName()).isEqualTo("com.android.settings1"); @@ -320,7 +324,7 @@ public final class ConvertUtilsTest { final long userId = 1; final AppUsageEvent appUsageEvent = - ConvertUtils.convertToAppUsageEvent(mContext, event, userId); + ConvertUtils.convertToAppUsageEvent(mContext, mUsageStatsManager, event, userId); assertThat(appUsageEvent.getTimestamp()).isEqualTo(101L); assertThat(appUsageEvent.getType()).isEqualTo(AppUsageEventType.DEVICE_SHUTDOWN); assertThat(appUsageEvent.getPackageName()).isEqualTo("com.android.settings1"); @@ -336,7 +340,8 @@ public final class ConvertUtilsTest { event.mPackage = null; final AppUsageEvent appUsageEvent = - ConvertUtils.convertToAppUsageEvent(mContext, event, /*userId=*/ 0); + ConvertUtils.convertToAppUsageEvent( + mContext, mUsageStatsManager, event, /*userId=*/ 0); assertThat(appUsageEvent).isNull(); } @@ -352,7 +357,7 @@ public final class ConvertUtilsTest { final long userId = 1; final AppUsageEvent appUsageEvent = - ConvertUtils.convertToAppUsageEvent(mContext, event, userId); + ConvertUtils.convertToAppUsageEvent(mContext, mUsageStatsManager, event, userId); assertThat(appUsageEvent).isNull(); } @@ -453,7 +458,7 @@ public final class ConvertUtilsTest { final String taskRootPackageName = "com.android.settings2"; assertThat(ConvertUtils.getEffectivePackageName( - mContext, packageName, taskRootPackageName)) + mContext, mUsageStatsManager, packageName, taskRootPackageName)) .isEqualTo(packageName); } @@ -463,7 +468,7 @@ public final class ConvertUtilsTest { final String taskRootPackageName = "com.android.settings2"; assertThat(ConvertUtils.getEffectivePackageName( - mContext, packageName, taskRootPackageName)) + mContext, mUsageStatsManager, packageName, taskRootPackageName)) .isEqualTo(packageName); } @@ -474,7 +479,7 @@ public final class ConvertUtilsTest { final String taskRootPackageName = "com.android.settings2"; assertThat(ConvertUtils.getEffectivePackageName( - mContext, packageName, taskRootPackageName)) + mContext, mUsageStatsManager, packageName, taskRootPackageName)) .isEqualTo(taskRootPackageName); } @@ -484,10 +489,10 @@ public final class ConvertUtilsTest { final String packageName = "com.android.settings1"; assertThat(ConvertUtils.getEffectivePackageName( - mContext, packageName, /*taskRootPackageName=*/ null)) + mContext, mUsageStatsManager, packageName, /*taskRootPackageName=*/ null)) .isEqualTo(packageName); assertThat(ConvertUtils.getEffectivePackageName( - mContext, packageName, /*taskRootPackageName=*/ "")) + mContext, mUsageStatsManager, packageName, /*taskRootPackageName=*/ "")) .isEqualTo(packageName); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java index 7f7fe43bb9e..b610cfbf289 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java @@ -72,7 +72,7 @@ public final class DataProcessManagerTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - DatabaseUtils.sUsageStatsManager = mUsageStatsManager; + DataProcessor.sUsageStatsManager = mUsageStatsManager; doReturn(mContext).when(mContext).getApplicationContext(); doReturn(mUserManager) .when(mContext) diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java index 8bed054e91e..c9b635eeb0e 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java @@ -93,7 +93,7 @@ public final class DataProcessorTest { mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider; DataProcessor.sTestSystemAppsPackageNames = Set.of(); - DatabaseUtils.sUsageStatsManager = mUsageStatsManager; + DataProcessor.sUsageStatsManager = mUsageStatsManager; doReturn(mIntent).when(mContext).registerReceiver( isA(BroadcastReceiver.class), isA(IntentFilter.class)); doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt()); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java index 24be7698375..8a1ba137958 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java @@ -85,7 +85,7 @@ public final class DatabaseUtilsTest { doReturn(mPackageManager).when(mMockContext).getPackageManager(); doReturn(mPackageManager).when(mContext).getPackageManager(); DatabaseUtils.getSharedPreferences(mContext).edit().clear().apply(); - DatabaseUtils.sUsageStatsManager = mUsageStatsManager; + DataProcessor.sUsageStatsManager = mUsageStatsManager; } @Test @@ -466,7 +466,7 @@ public final class DatabaseUtilsTest { .putInt(DatabaseUtils.KEY_LAST_USAGE_SOURCE, USAGE_SOURCE_TASK_ROOT_ACTIVITY) .apply(); - assertThat(DatabaseUtils.getUsageSource(mContext)) + assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager)) .isEqualTo(USAGE_SOURCE_TASK_ROOT_ACTIVITY); } @@ -474,7 +474,7 @@ public final class DatabaseUtilsTest { public void getUsageSource_notHasData_writeLoadedData() throws RemoteException { when(mUsageStatsManager.getUsageSource()).thenReturn(USAGE_SOURCE_TASK_ROOT_ACTIVITY); - assertThat(DatabaseUtils.getUsageSource(mContext)) + assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager)) .isEqualTo(USAGE_SOURCE_TASK_ROOT_ACTIVITY); assertThat( DatabaseUtils @@ -487,7 +487,7 @@ public final class DatabaseUtilsTest { public void getUsageSource_throwException_writeDefaultData() throws RemoteException { when(mUsageStatsManager.getUsageSource()).thenThrow(new RemoteException()); - assertThat(DatabaseUtils.getUsageSource(mContext)) + assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager)) .isEqualTo(USAGE_SOURCE_CURRENT_ACTIVITY); assertThat( DatabaseUtils From a277f78789d19629af276ebfa8cad0120a9fe054 Mon Sep 17 00:00:00 2001 From: Wesley Wang Date: Wed, 9 Aug 2023 18:31:57 +0800 Subject: [PATCH 4/4] Update detectSettingsAnomaly() return type (1/2) Bug: 291689623 Test: make SettingsRoboTests Change-Id: I3611e746900569dca8cf308072c1344686d27f9a --- .../android/settings/fuelgauge/PowerUsageFeatureProvider.java | 3 ++- .../settings/fuelgauge/PowerUsageFeatureProviderImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java index 258ded1a682..30eabfabb3f 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java @@ -22,6 +22,7 @@ import android.os.Bundle; import android.util.ArrayMap; import android.util.SparseIntArray; +import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEventList; import com.android.settingslib.fuelgauge.Estimate; import java.util.List; @@ -147,7 +148,7 @@ public interface PowerUsageFeatureProvider { /** * Returns {@link Bundle} for settings anomaly detection result */ - Bundle detectSettingsAnomaly(Context context, double displayDrain); + PowerAnomalyEventList detectSettingsAnomaly(Context context, double displayDrain); /** * Gets an intent for one time bypass charge limited to resume charging. diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index ed9751834ce..127178a4993 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -21,13 +21,13 @@ import static com.android.settings.Utils.SYSTEMUI_PACKAGE_NAME; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.os.Bundle; import android.os.Process; import android.util.ArrayMap; import android.util.ArraySet; import android.util.SparseIntArray; import com.android.internal.util.ArrayUtils; +import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEventList; import com.android.settingslib.fuelgauge.Estimate; import java.util.ArrayList; @@ -175,7 +175,7 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider public void insertSettingsData(Context context, double displayDrain) {} @Override - public Bundle detectSettingsAnomaly(Context context, double displayDrain) { + public PowerAnomalyEventList detectSettingsAnomaly(Context context, double displayDrain) { return null; }