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:
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user