Refine the update process of battery tip

1. When device is rotated, don't update the battery tip
2. When user go back to battery main page from other page, start
battery tip update process
3. In RestrictAppTip, if there aren't restricted apps anymore,
hide the tip.

Bug: 74467010
Test: RunSettingsRobotests

Change-Id: I300bcc5b487d587f6618e340ac074fe416dcc1b2
This commit is contained in:
Lei Yu
2018-03-12 16:13:35 -07:00
parent 0a5367c0c4
commit 0ae2cd68f2
6 changed files with 64 additions and 8 deletions

View File

@@ -105,6 +105,8 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
SparseArray<List<Anomaly>> mAnomalySparseArray;
@VisibleForTesting
BatteryHeaderPreferenceController mBatteryHeaderPreferenceController;
@VisibleForTesting
boolean mNeedUpdateBatteryTip;
private BatteryTipPreferenceController mBatteryTipPreferenceController;
private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
@@ -211,6 +213,8 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
mAnomalySparseArray = new SparseArray<>();
restartBatteryInfoLoader();
mNeedUpdateBatteryTip = icicle == null;
mBatteryTipPreferenceController.restoreInstanceState(icicle);
}
@Override
@@ -291,7 +295,12 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
return;
}
// Only skip BatteryTipLoader for the first time when device is rotated
if (mNeedUpdateBatteryTip) {
restartBatteryTipLoader();
} else {
mNeedUpdateBatteryTip = true;
}
// reload BatteryInfo and updateUI
restartBatteryInfoLoader();
@@ -385,6 +394,12 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
restartBatteryStatsLoader(true /* clearHeader */);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBatteryTipPreferenceController.saveInstanceState(outState);
}
void restartBatteryStatsLoader(boolean clearHeader) {
super.restartBatteryStatsLoader();
if (clearHeader) {

View File

@@ -17,8 +17,8 @@
package com.android.settings.fuelgauge.batterytip;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
@@ -34,6 +34,7 @@ import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -44,6 +45,7 @@ import java.util.Map;
public class BatteryTipPreferenceController extends BasePreferenceController {
private static final String TAG = "BatteryTipPreferenceController";
private static final int REQUEST_ANOMALY_ACTION = 0;
private static final String KEY_BATTERY_TIPS = "key_battery_tips";
private BatteryTipListener mBatteryTipListener;
private List<BatteryTip> mBatteryTips;
@@ -138,6 +140,17 @@ public class BatteryTipPreferenceController extends BasePreferenceController {
return super.handlePreferenceTreeClick(preference);
}
public void restoreInstanceState(Bundle bundle) {
if (bundle != null) {
List<BatteryTip> batteryTips = bundle.getParcelableArrayList(KEY_BATTERY_TIPS);
updateBatteryTips(batteryTips);
}
}
public void saveInstanceState(Bundle outState) {
outState.putParcelableList(KEY_BATTERY_TIPS, mBatteryTips);
}
/**
* Listener to give the control back to target fragment
*/

View File

@@ -98,6 +98,9 @@ public class RestrictAppTip extends BatteryTip {
// If anomaly becomes invisible, show it as handled
mState = StateType.HANDLED;
mShowDialog = false;
} else {
mState = tip.getState();
mShowDialog = tip.shouldShowDialog();
}
}

View File

@@ -352,6 +352,14 @@ public class PowerUsageSummaryTest {
R.string.advanced_battery_title);
}
@Test
public void testRefreshUi_deviceRotate_doNotUpdateBatteryTip() {
mFragment.mNeedUpdateBatteryTip = false;
mFragment.refreshUi();
verify(mFragment, never()).restartBatteryTipLoader();
}
public static class TestFragment extends PowerUsageSummary {
private Context mContext;
@@ -364,12 +372,6 @@ public class PowerUsageSummaryTest {
return mContext;
}
@Override
protected void refreshUi() {
// Leave it empty for toggle apps menu test
}
@Override
void showBothEstimates() {
List<BatteryInfo> fakeBatteryInfo = new ArrayList<>(2);

View File

@@ -28,6 +28,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceGroup;
@@ -133,6 +134,21 @@ public class BatteryTipPreferenceControllerTest {
BatteryTip.StateType.NEW);
}
@Test
public void testSaveAndRestore() {
mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
final Bundle bundle = new Bundle();
mBatteryTipPreferenceController.saveInstanceState(bundle);
final BatteryTipPreferenceController controller = new BatteryTipPreferenceController(
mContext, KEY_PREF, mSettingsActivity, mFragment, mBatteryTipListener);
controller.mPreferenceGroup = mPreferenceGroup;
controller.mPrefContext = mContext;
controller.restoreInstanceState(bundle);
assertOnlyContainsSummaryTip(mPreferenceGroup);
}
@Test
public void testHandlePreferenceTreeClick_noDialog_invokeCallback() {
when(mBatteryTip.getType()).thenReturn(SMART_BATTERY_MANAGER);

View File

@@ -148,6 +148,13 @@ public class RestrictAppTipTest {
assertThat(mNewBatteryTip.getState()).isEqualTo(BatteryTip.StateType.HANDLED);
}
@Test
public void update_handledAnomlayBecomeInvisible_stateInvisible() {
mHandledBatteryTip.updateState(mInvisibleBatteryTip);
assertThat(mHandledBatteryTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
}
@Test
public void update_newAnomalyComes_stateNew() {
mInvisibleBatteryTip.updateState(mNewBatteryTip);