diff --git a/res/layout/battery_usage_graph.xml b/res/layout/battery_usage_graph.xml index 1ab848edcf6..f46ac6afae8 100644 --- a/res/layout/battery_usage_graph.xml +++ b/res/layout/battery_usage_graph.xml @@ -43,4 +43,11 @@ android:gravity="end" settings:textColor="?android:attr/textColorSecondary" /> + + diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java index 920f0e22fbc..2927002eed1 100644 --- a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java +++ b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java @@ -21,6 +21,7 @@ import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; import android.util.AttributeSet; +import android.view.View; import android.widget.TextView; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; @@ -32,6 +33,10 @@ import com.android.settings.graph.UsageView; */ public class BatteryHistoryPreference extends Preference { + private CharSequence mSummary; + private TextView mSummaryView; + private boolean hideSummary; + @VisibleForTesting BatteryInfo mBatteryInfo; @@ -48,6 +53,20 @@ public class BatteryHistoryPreference extends Preference { }, batteryStats.getStats(), false); } + public void setBottomSummary(CharSequence text) { + mSummary = text; + if (mSummaryView != null) { + mSummaryView.setText(mSummary); + } + } + + public void hideBottomSummary() { + if (mSummaryView != null) { + mSummaryView.setVisibility(View.GONE); + } + hideSummary = true; + } + @Override public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); @@ -56,6 +75,13 @@ public class BatteryHistoryPreference extends Preference { } ((TextView) view.findViewById(R.id.charge)).setText(mBatteryInfo.batteryPercentString); + mSummaryView = (TextView) view.findViewById(R.id.bottom_summary); + if (mSummary != null) { + mSummaryView.setText(mSummary); + } + if (hideSummary) { + mSummaryView.setVisibility(View.GONE); + } UsageView usageView = (UsageView) view.findViewById(R.id.battery_usage); usageView.findViewById(R.id.label_group).setAlpha(.7f); mBatteryInfo.bindHistory(usageView); diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java index 0940e19d480..fc83bedf6e3 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java +++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java @@ -69,9 +69,9 @@ public class PowerUsageAdvanced extends PowerUsageBase { UsageType.UNACCOUNTED, UsageType.OVERCOUNTED}; + @VisibleForTesting BatteryHistoryPreference mHistPref; + @VisibleForTesting PreferenceGroup mUsageListGroup; private BatteryUtils mBatteryUtils; - private BatteryHistoryPreference mHistPref; - private PreferenceGroup mUsageListGroup; private PowerUsageFeatureProvider mPowerUsageFeatureProvider; private PackageManager mPackageManager; private UserManager mUserManager; @@ -170,6 +170,14 @@ public class PowerUsageAdvanced extends PowerUsageBase { } updatePreference(mHistPref); refreshPowerUsageDataList(mStatsHelper, mUsageListGroup); + + if (mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(context)) { + mHistPref.setBottomSummary( + mPowerUsageFeatureProvider.getAdvancedUsageScreenInfoString()); + } else { + mHistPref.hideBottomSummary(); + } + BatteryEntry.startRequestQueue(); } diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java index e003e6d806f..732db23b780 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java @@ -113,4 +113,10 @@ public interface PowerUsageFeatureProvider { * @return A string containing the estimate and a label indicating it is a normal estimate */ String getOldEstimateDebugString(String timeRemaining); + + /** + * Returns the string to show in the advanced usage battery page when enhanced estimates are + * enabled. This string notifies users that the estimate is using enhanced prediction. + */ + String getAdvancedUsageScreenInfoString(); } diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index c43eebd2034..1d8e03ac7b5 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -132,4 +132,9 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider public String getOldEstimateDebugString(String timeRemaining) { return null; } + + @Override + public String getAdvancedUsageScreenInfoString() { + return null; + } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoryPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoryPreferenceTest.java index 5a5e28db2f8..4f8f2221da8 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistoryPreferenceTest.java @@ -15,6 +15,7 @@ */ package com.android.settings.fuelgauge; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.spy; @@ -49,6 +50,7 @@ import org.robolectric.annotation.Config; SettingsShadowResources.SettingsShadowTheme.class }) public class BatteryHistoryPreferenceTest { + public static final String TEST_STRING = "test"; @Mock private PreferenceViewHolder mViewHolder; @Mock @@ -86,4 +88,24 @@ public class BatteryHistoryPreferenceTest { verify(mTextView).setText(nullable(String.class)); verify(mBatteryInfo).bindHistory(mUsageView); } + + @Test + public void testSetBottomSummary_updatesBottomSummaryTextIfSet() { + mBatteryHistoryPreference.setBottomSummary(TEST_STRING); + mBatteryHistoryPreference.onBindViewHolder(mViewHolder); + + TextView view = (TextView) mViewHolder.findViewById(R.id.bottom_summary); + assertThat(view.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(view.getText()).isEqualTo(TEST_STRING); + } + + @Test + public void testSetBottomSummary_leavesBottomSummaryTextBlankIfNotSet() { + mBatteryHistoryPreference.hideBottomSummary(); + mBatteryHistoryPreference.onBindViewHolder(mViewHolder); + + TextView view = (TextView) mViewHolder.findViewById(R.id.bottom_summary); + assertThat(view.getVisibility()).isEqualTo(View.GONE); + assertThat(view.getText()).isEqualTo(""); + } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java index 8831a6c4791..7ab505d6652 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java @@ -20,7 +20,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -81,6 +83,10 @@ public class PowerUsageAdvancedTest { private PackageManager mPackageManager; @Mock private UserManager mUserManager; + @Mock + private BatteryHistoryPreference mHistPref; + @Mock + private PreferenceGroup mUsageListGroup; private PowerUsageAdvanced mPowerUsageAdvanced; private PowerUsageData mPowerUsageData; private Context mShadowContext; @@ -352,4 +358,26 @@ public class PowerUsageAdvancedTest { assertThat(mPowerUsageAdvanced.calculateHiddenPower(powerUsageDataList)).isWithin( PRECISION).of(unaccountedPower); } + + @Test + public void testRefreshUi_addsSubtextWhenAppropriate() { + // Mock out all the battery stuff + mPowerUsageAdvanced.mHistPref = mHistPref; + mPowerUsageAdvanced.mStatsHelper = mBatteryStatsHelper; + doReturn(new ArrayList()) + .when(mPowerUsageAdvanced).parsePowerUsageData(any()); + doReturn("").when(mPowerUsageAdvanced).getString(anyInt()); + mPowerUsageAdvanced.mUsageListGroup = mUsageListGroup; + + // refresh the ui and check that text was not updated when enhanced prediction disabled + when(mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(any())) + .thenReturn(false); + mPowerUsageAdvanced.refreshUi(); + verify(mHistPref, never()).setBottomSummary(any()); + + // refresh the ui and check that text was updated when enhanced prediction enabled + when(mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(any())).thenReturn(true); + mPowerUsageAdvanced.refreshUi(); + verify(mHistPref, atLeastOnce()).setBottomSummary(any()); + } }