Fix a crash in battery settings page

Regression from ag/7161923, in this case we should use onResume/onPause
pair. Also sort the method to fit android lifecycle.

Bug: 131615524
Test: RunSettingsRoboTests
Change-Id: I299032bfeb119dac293039917c6673dd4c0ef4e0
This commit is contained in:
Lei Yu
2019-04-29 13:25:24 -07:00
parent 7c802e553f
commit aa625bd06e
2 changed files with 68 additions and 23 deletions

View File

@@ -19,6 +19,7 @@ package com.android.settings.fuelgauge;
import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType; import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.net.Uri; import android.net.Uri;
@@ -107,7 +108,8 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
BatteryTipPreferenceController mBatteryTipPreferenceController; BatteryTipPreferenceController mBatteryTipPreferenceController;
private int mStatsType = BatteryStats.STATS_SINCE_CHARGED; private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) { @VisibleForTesting
final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) {
@Override @Override
public void onChange(boolean selfChange, Uri uri) { public void onChange(boolean selfChange, Uri uri) {
restartBatteryInfoLoader(); restartBatteryInfoLoader();
@@ -201,21 +203,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
} }
}; };
@Override
public void onStop() {
getContentResolver().unregisterContentObserver(mSettingsObserver);
super.onStop();
}
@Override
public void onResume() {
super.onResume();
getContentResolver().registerContentObserver(
Global.getUriFor(Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
false,
mSettingsObserver);
}
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
@@ -251,6 +238,21 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
updateBatteryTipFlag(icicle); updateBatteryTipFlag(icicle);
} }
@Override
public void onResume() {
super.onResume();
getContentResolver().registerContentObserver(
Global.getUriFor(Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
false,
mSettingsObserver);
}
@Override
public void onPause() {
getContentResolver().unregisterContentObserver(mSettingsObserver);
super.onPause();
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.FUELGAUGE_POWER_USAGE_SUMMARY_V2; return SettingsEnums.FUELGAUGE_POWER_USAGE_SUMMARY_V2;

View File

@@ -33,16 +33,20 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
import androidx.preference.PreferenceScreen;
import com.android.internal.os.BatterySipper; import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryStatsHelper;
@@ -51,6 +55,7 @@ import com.android.settings.SettingsActivity;
import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.XmlTestUtils;
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
import org.junit.Before; import org.junit.Before;
@@ -66,6 +71,7 @@ import org.mockito.stubbing.Answer;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -117,6 +123,14 @@ public class PowerUsageSummaryTest {
private MenuItem mAdvancedPageMenu; private MenuItem mAdvancedPageMenu;
@Mock @Mock
private BatteryInfo mBatteryInfo; private BatteryInfo mBatteryInfo;
@Mock
private ContentResolver mContentResolver;
@Mock
private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
@Mock
private VisibilityLoggerMixin mVisibilityLoggerMixin;
@Mock
private PreferenceScreen mPreferenceScreen;
private List<BatterySipper> mUsageList; private List<BatterySipper> mUsageList;
private Context mRealContext; private Context mRealContext;
@@ -148,7 +162,7 @@ public class PowerUsageSummaryTest {
.thenReturn(sAdditionalBatteryInfoIntent); .thenReturn(sAdditionalBatteryInfoIntent);
when(mBatteryHelper.getTotalPower()).thenReturn(TOTAL_POWER); when(mBatteryHelper.getTotalPower()).thenReturn(TOTAL_POWER);
when(mBatteryHelper.getStats().computeBatteryRealtime(anyLong(), anyInt())) when(mBatteryHelper.getStats().computeBatteryRealtime(anyLong(), anyInt()))
.thenReturn(TIME_SINCE_LAST_FULL_CHARGE_US); .thenReturn(TIME_SINCE_LAST_FULL_CHARGE_US);
when(mNormalBatterySipper.getUid()).thenReturn(UID); when(mNormalBatterySipper.getUid()).thenReturn(UID);
mNormalBatterySipper.totalPowerMah = POWER_MAH; mNormalBatterySipper.totalPowerMah = POWER_MAH;
@@ -176,6 +190,11 @@ public class PowerUsageSummaryTest {
mFragment.mScreenUsagePref = mScreenUsagePref; mFragment.mScreenUsagePref = mScreenUsagePref;
mFragment.mLastFullChargePref = mLastFullChargePref; mFragment.mLastFullChargePref = mLastFullChargePref;
mFragment.mBatteryUtils = spy(new BatteryUtils(mRealContext)); mFragment.mBatteryUtils = spy(new BatteryUtils(mRealContext));
ReflectionHelpers.setField(mFragment, "mVisibilityLoggerMixin", mVisibilityLoggerMixin);
ReflectionHelpers.setField(mFragment, "mBatteryBroadcastReceiver",
mBatteryBroadcastReceiver);
doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
when(mFragment.getContentResolver()).thenReturn(mContentResolver);
} }
@Test @Test
@@ -207,10 +226,10 @@ public class PowerUsageSummaryTest {
public void nonIndexableKeys_MatchPreferenceKeys() { public void nonIndexableKeys_MatchPreferenceKeys() {
final Context context = RuntimeEnvironment.application; final Context context = RuntimeEnvironment.application;
final List<String> niks = final List<String> niks =
PowerUsageSummary.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(context); PowerUsageSummary.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(context);
final List<String> keys = final List<String> keys =
XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.power_usage_summary); XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.power_usage_summary);
assertThat(keys).containsAllIn(niks); assertThat(keys).containsAllIn(niks);
} }
@@ -223,25 +242,25 @@ public class PowerUsageSummaryTest {
mFragment.restartBatteryTipLoader(); mFragment.restartBatteryTipLoader();
verify(mLoaderManager) verify(mLoaderManager)
.restartLoader(eq(PowerUsageSummary.BATTERY_TIP_LOADER), eq(Bundle.EMPTY), any()); .restartLoader(eq(PowerUsageSummary.BATTERY_TIP_LOADER), eq(Bundle.EMPTY), any());
} }
@Test @Test
public void showBothEstimates_summariesAreBothModified() { public void showBothEstimates_summariesAreBothModified() {
when(mFeatureFactory.powerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(any())) when(mFeatureFactory.powerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(any()))
.thenReturn(true); .thenReturn(true);
doAnswer(new Answer() { doAnswer(new Answer() {
@Override @Override
public Object answer(InvocationOnMock invocation) { public Object answer(InvocationOnMock invocation) {
return mRealContext.getString( return mRealContext.getString(
R.string.power_usage_old_debug, invocation.getArguments()[0]); R.string.power_usage_old_debug, invocation.getArguments()[0]);
} }
}).when(mFeatureFactory.powerUsageFeatureProvider).getOldEstimateDebugString(any()); }).when(mFeatureFactory.powerUsageFeatureProvider).getOldEstimateDebugString(any());
doAnswer(new Answer() { doAnswer(new Answer() {
@Override @Override
public Object answer(InvocationOnMock invocation) { public Object answer(InvocationOnMock invocation) {
return mRealContext.getString( return mRealContext.getString(
R.string.power_usage_enhanced_debug, invocation.getArguments()[0]); R.string.power_usage_enhanced_debug, invocation.getArguments()[0]);
} }
}).when(mFeatureFactory.powerUsageFeatureProvider).getEnhancedEstimateDebugString(any()); }).when(mFeatureFactory.powerUsageFeatureProvider).getEnhancedEstimateDebugString(any());
@@ -336,6 +355,24 @@ public class PowerUsageSummaryTest {
verify(mFragment).restartBatteryTipLoader(); verify(mFragment).restartBatteryTipLoader();
} }
@Test
public void onResume_registerContentObserver() {
mFragment.onResume();
verify(mContentResolver).registerContentObserver(
Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
false,
mFragment.mSettingsObserver);
}
@Test
public void onPause_unregisterContentObserver() {
mFragment.onPause();
verify(mContentResolver).unregisterContentObserver(
mFragment.mSettingsObserver);
}
public static class TestFragment extends PowerUsageSummary { public static class TestFragment extends PowerUsageSummary {
private Context mContext; private Context mContext;
@@ -348,6 +385,12 @@ public class PowerUsageSummaryTest {
return mContext; return mContext;
} }
@Override
protected ContentResolver getContentResolver() {
// Override it so we can access this method in test
return super.getContentResolver();
}
@Override @Override
void showBothEstimates() { void showBothEstimates() {
List<BatteryInfo> fakeBatteryInfo = new ArrayList<>(2); List<BatteryInfo> fakeBatteryInfo = new ArrayList<>(2);