OSDN Git Service

Update the battery broadcast receiver.
authorLei Yu <jackqdyulei@google.com>
Thu, 10 May 2018 00:27:17 +0000 (17:27 -0700)
committerLei Yu <jackqdyulei@google.com>
Mon, 14 May 2018 19:40:50 +0000 (19:40 +0000)
Add a type for battery receiver, then in callback client know for
which reason it been invoked:
1. battery level change
2. battery saver state change
3. battery plug state change

So in this CL, we won't update battery tip for battery level change,
then battery tip won't be dismissed by itself.

Also note in onResume() we will manually update battery tip. So if
user stay in battery settings page and close the screen, once he opens
it we will still force update everything.

Fixes: 79171742
Test: RunSettingsRoboTests

Change-Id: I997844216fd8267e545d74e0d434de9e338f76a1
Merged-In: I997844216fd8267e545d74e0d434de9e338f76a1

src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
src/com/android/settings/fuelgauge/PowerUsageBase.java
src/com/android/settings/fuelgauge/PowerUsageSummary.java
tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java
tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java

index ca4742d..3075d9b 100644 (file)
@@ -21,9 +21,14 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.PowerManager;
+import android.support.annotation.IntDef;
 import android.support.annotation.VisibleForTesting;
 
 import com.android.settings.Utils;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 
 /**
  * Use this broadcastReceiver to listen to the battery change, and it will invoke
@@ -43,7 +48,19 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
      * Battery saver(e.g. off->on)
      */
     public interface OnBatteryChangedListener {
-        void onBatteryChanged();
+        void onBatteryChanged(@BatteryUpdateType int type);
+    }
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({BatteryUpdateType.MANUAL,
+            BatteryUpdateType.BATTERY_LEVEL,
+            BatteryUpdateType.BATTERY_SAVER,
+            BatteryUpdateType.BATTERY_STATUS})
+    public @interface BatteryUpdateType {
+        int MANUAL = 0;
+        int BATTERY_LEVEL = 1;
+        int BATTERY_SAVER = 2;
+        int BATTERY_STATUS = 3;
     }
 
     @VisibleForTesting
@@ -85,14 +102,17 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
                 final String batteryLevel = Utils.getBatteryPercentage(intent);
                 final String batteryStatus = Utils.getBatteryStatus(
                         mContext.getResources(), intent);
-                if (forceUpdate || !batteryLevel.equals(mBatteryLevel) || !batteryStatus.equals(
-                        mBatteryStatus)) {
-                    mBatteryLevel = batteryLevel;
-                    mBatteryStatus = batteryStatus;
-                    mBatteryListener.onBatteryChanged();
+                if (forceUpdate) {
+                    mBatteryListener.onBatteryChanged(BatteryUpdateType.MANUAL);
+                } else if(!batteryLevel.equals(mBatteryLevel)) {
+                    mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_LEVEL);
+                } else if (!batteryStatus.equals(mBatteryStatus)) {
+                    mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_STATUS);
                 }
+                mBatteryLevel = batteryLevel;
+                mBatteryStatus = batteryStatus;
             } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(intent.getAction())) {
-                mBatteryListener.onBatteryChanged();
+                mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_SAVER);
             }
         }
     }
index 327a6c5..6493430 100644 (file)
@@ -13,6 +13,8 @@
  */
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType;
+
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -30,7 +32,6 @@ import com.android.settings.SettingsActivity;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.utils.StringUtil;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -106,7 +107,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
                 mMetricsFeatureProvider.action(getContext(),
                         MetricsProto.MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE,
                         mShowAllApps);
-                restartBatteryStatsLoader();
+                restartBatteryStatsLoader(BatteryUpdateType.MANUAL);
                 return true;
             default:
                 return super.onOptionsItemSelected(item);
@@ -138,7 +139,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
     }
 
     @Override
-    protected void refreshUi() {
+    protected void refreshUi(@BatteryUpdateType int refreshType) {
         final Context context = getContext();
         if (context == null) {
             return;
index b811f20..58d9d08 100644 (file)
@@ -15,6 +15,8 @@
  */
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.*;
+
 import android.app.Activity;
 import android.app.LoaderManager;
 import android.content.Context;
@@ -26,18 +28,17 @@ import android.view.Menu;
 
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settingslib.utils.AsyncLoader;
 
 /**
  * Common base class for things that need to show the battery usage graph.
  */
-public abstract class PowerUsageBase extends DashboardFragment
-        implements LoaderManager.LoaderCallbacks<BatteryStatsHelper> {
+public abstract class PowerUsageBase extends DashboardFragment {
 
     // +1 to allow ordering for PowerUsageSummary.
     @VisibleForTesting
     static final int MENU_STATS_REFRESH = Menu.FIRST + 1;
     private static final String TAG = "PowerUsageBase";
+    private static final String KEY_REFRESH_TYPE = "refresh_type";
 
     protected BatteryStatsHelper mStatsHelper;
     protected UserManager mUm;
@@ -57,8 +58,8 @@ public abstract class PowerUsageBase extends DashboardFragment
         setHasOptionsMenu(true);
 
         mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(getContext());
-        mBatteryBroadcastReceiver.setBatteryChangedListener(() -> {
-            restartBatteryStatsLoader();
+        mBatteryBroadcastReceiver.setBatteryChangedListener(type -> {
+            restartBatteryStatsLoader(type);
         });
     }
 
@@ -81,11 +82,14 @@ public abstract class PowerUsageBase extends DashboardFragment
         mBatteryBroadcastReceiver.unRegister();
     }
 
-    protected void restartBatteryStatsLoader() {
-        getLoaderManager().restartLoader(0, Bundle.EMPTY, this);
+    protected void restartBatteryStatsLoader(int refreshType) {
+        final Bundle bundle = new Bundle();
+        bundle.putInt(KEY_REFRESH_TYPE, refreshType);
+
+        getLoaderManager().restartLoader(0, bundle, new PowerLoaderCallback());
     }
 
-    protected abstract void refreshUi();
+    protected abstract void refreshUi(@BatteryUpdateType int refreshType);
 
     protected void updatePreference(BatteryHistoryPreference historyPref) {
         final long startTime = System.currentTimeMillis();
@@ -93,21 +97,30 @@ public abstract class PowerUsageBase extends DashboardFragment
         BatteryUtils.logRuntime(TAG, "updatePreference", startTime);
     }
 
-    @Override
-    public Loader<BatteryStatsHelper> onCreateLoader(int id,
-            Bundle args) {
-        return new BatteryStatsHelperLoader(getContext());
-    }
-
-    @Override
-    public void onLoadFinished(Loader<BatteryStatsHelper> loader,
-            BatteryStatsHelper statsHelper) {
-        mStatsHelper = statsHelper;
-        refreshUi();
-    }
-
-    @Override
-    public void onLoaderReset(Loader<BatteryStatsHelper> loader) {
-
+    /**
+     * {@link android.app.LoaderManager.LoaderCallbacks} for {@link PowerUsageBase} to load
+     * the {@link BatteryStatsHelper}
+     */
+    public class PowerLoaderCallback implements LoaderManager.LoaderCallbacks<BatteryStatsHelper> {
+        private int mRefreshType;
+
+        @Override
+        public Loader<BatteryStatsHelper> onCreateLoader(int id,
+                Bundle args) {
+            mRefreshType = args.getInt(KEY_REFRESH_TYPE);
+            return new BatteryStatsHelperLoader(getContext());
+        }
+
+        @Override
+        public void onLoadFinished(Loader<BatteryStatsHelper> loader,
+                BatteryStatsHelper statsHelper) {
+            mStatsHelper = statsHelper;
+            refreshUi(mRefreshType);
+        }
+
+        @Override
+        public void onLoaderReset(Loader<BatteryStatsHelper> loader) {
+
+        }
     }
 }
index 0563815..e4f7a72 100644 (file)
@@ -16,6 +16,8 @@
 
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType;
+
 import android.app.Activity;
 import android.app.LoaderManager;
 import android.app.LoaderManager.LoaderCallbacks;
@@ -277,7 +279,7 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
                 } else {
                     mStatsType = BatteryStats.STATS_SINCE_CHARGED;
                 }
-                refreshUi();
+                refreshUi(BatteryUpdateType.MANUAL);
                 return true;
             case MENU_ADVANCED_BATTERY:
                 new SubSettingLauncher(getContext())
@@ -291,14 +293,15 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
         }
     }
 
-    protected void refreshUi() {
+    protected void refreshUi(@BatteryUpdateType int refreshType) {
         final Context context = getContext();
         if (context == null) {
             return;
         }
 
-        // Only skip BatteryTipLoader for the first time when device is rotated
-        if (mNeedUpdateBatteryTip) {
+        // Skip BatteryTipLoader if device is rotated or only battery level change
+        if (mNeedUpdateBatteryTip
+                && refreshType != BatteryUpdateType.BATTERY_LEVEL) {
             restartBatteryTipLoader();
         } else {
             mNeedUpdateBatteryTip = true;
@@ -397,8 +400,9 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
     }
 
     @Override
-    protected void restartBatteryStatsLoader() {
-        restartBatteryStatsLoader(true /* clearHeader */);
+    protected void restartBatteryStatsLoader(@BatteryUpdateType int refreshType) {
+        super.restartBatteryStatsLoader(refreshType);
+        mBatteryHeaderPreferenceController.quickUpdateHeaderPreference();
     }
 
     @Override
@@ -407,13 +411,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
         mBatteryTipPreferenceController.saveInstanceState(outState);
     }
 
-    void restartBatteryStatsLoader(boolean clearHeader) {
-        super.restartBatteryStatsLoader();
-        if (clearHeader) {
-            mBatteryHeaderPreferenceController.quickUpdateHeaderPreference();
-        }
-    }
-
     @Override
     public void onBatteryTipHandled(BatteryTip batteryTip) {
         restartBatteryTipLoader();
@@ -428,7 +425,7 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
             mContext = context;
             mLoader = loader;
             mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext);
-            mBatteryBroadcastReceiver.setBatteryChangedListener(() -> {
+            mBatteryBroadcastReceiver.setBatteryChangedListener(type -> {
                 BatteryInfo.getBatteryInfo(mContext, new BatteryInfo.Callback() {
                     @Override
                     public void onBatteryInfoLoaded(BatteryInfo info) {
index 3fdbe83..4583dd1 100644 (file)
  */
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType;
+
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -70,14 +73,14 @@ public class BatteryBroadcastReceiverTest {
     }
 
     @Test
-    public void testOnReceive_batteryDataChanged_dataUpdated() {
+    public void testOnReceive_batteryLevelChanged_dataUpdated() {
         mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
 
         assertThat(mBatteryBroadcastReceiver.mBatteryLevel)
             .isEqualTo(Utils.getBatteryPercentage(mChargingIntent));
         assertThat(mBatteryBroadcastReceiver.mBatteryStatus)
             .isEqualTo(Utils.getBatteryStatus(mContext.getResources(), mChargingIntent));
-        verify(mBatteryListener).onBatteryChanged();
+        verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_LEVEL);
     }
 
     @Test
@@ -85,7 +88,7 @@ public class BatteryBroadcastReceiverTest {
         mBatteryBroadcastReceiver.onReceive(mContext,
                 new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
 
-        verify(mBatteryListener).onBatteryChanged();
+        verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_SAVER);
     }
 
     @Test
@@ -100,7 +103,7 @@ public class BatteryBroadcastReceiverTest {
 
         assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(batteryLevel);
         assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus);
-        verify(mBatteryListener, never()).onBatteryChanged();
+        verify(mBatteryListener, never()).onBatteryChanged(anyInt());
     }
 
     @Test
@@ -115,6 +118,6 @@ public class BatteryBroadcastReceiverTest {
         assertThat(mBatteryBroadcastReceiver.mBatteryStatus)
             .isEqualTo(Utils.getBatteryStatus(mContext.getResources(), mChargingIntent));
         // 2 times because register will force update the battery
-        verify(mBatteryListener, times(2)).onBatteryChanged();
+        verify(mBatteryListener, times(2)).onBatteryChanged(BatteryUpdateType.MANUAL);
     }
 }
index 4a905b4..9b61e5f 100644 (file)
@@ -18,6 +18,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.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -86,7 +87,7 @@ public class PowerUsageAdvancedTest {
     @Test
     public void testOptionsMenu_menuAppToggle_metricEventInvoked() {
         mFragment.mShowAllApps = false;
-        doNothing().when(mFragment).restartBatteryStatsLoader();
+        doNothing().when(mFragment).restartBatteryStatsLoader(anyInt());
 
         mFragment.onOptionsItemSelected(mToggleAppsMenu);
 
index d9f572d..eb683c0 100644 (file)
@@ -74,7 +74,7 @@ public class PowerUsageBaseTest {
         }
 
         @Override
-        protected void refreshUi() {
+        protected void refreshUi(int refreshType) {
             // Do nothing
         }
 
index b48f00e..07341a1 100644 (file)
@@ -149,7 +149,7 @@ public class PowerUsageSummaryTest {
         mFragment.initFeatureProvider();
         mBatteryMeterView = new BatteryMeterView(mRealContext);
         mBatteryMeterView.mDrawable = new BatteryMeterView.BatteryMeterDrawable(mRealContext, 0);
-        doNothing().when(mFragment).restartBatteryStatsLoader();
+        doNothing().when(mFragment).restartBatteryStatsLoader(anyInt());
         doReturn(mock(LoaderManager.class)).when(mFragment).getLoaderManager();
         doReturn(MENU_ADVANCED_BATTERY).when(mAdvancedPageMenu).getItemId();
 
@@ -317,15 +317,6 @@ public class PowerUsageSummaryTest {
     }
 
     @Test
-    public void restartBatteryStatsLoader_notClearHeader_quickUpdateNotInvoked() {
-        mFragment.mBatteryHeaderPreferenceController = mBatteryHeaderPreferenceController;
-
-        mFragment.restartBatteryStatsLoader(false /* clearHeader */);
-
-        verify(mBatteryHeaderPreferenceController, never()).quickUpdateHeaderPreference();
-    }
-
-    @Test
     public void optionsMenu_advancedPageEnabled() {
         when(mFeatureFactory.powerUsageFeatureProvider.isPowerAccountingToggleEnabled())
                 .thenReturn(true);
@@ -360,7 +351,18 @@ public class PowerUsageSummaryTest {
         when(mFragment.mBatteryTipPreferenceController.needUpdate()).thenReturn(false);
         mFragment.updateBatteryTipFlag(new Bundle());
 
-        mFragment.refreshUi();
+        mFragment.refreshUi(BatteryBroadcastReceiver.BatteryUpdateType.MANUAL);
+
+        verify(mFragment, never()).restartBatteryTipLoader();
+    }
+
+    @Test
+    public void refreshUi_batteryLevelChanged_doNotUpdateBatteryTip() {
+        mFragment.mBatteryTipPreferenceController = mock(BatteryTipPreferenceController.class);
+        when(mFragment.mBatteryTipPreferenceController.needUpdate()).thenReturn(true);
+        mFragment.updateBatteryTipFlag(new Bundle());
+
+        mFragment.refreshUi(BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_LEVEL);
 
         verify(mFragment, never()).restartBatteryTipLoader();
     }
@@ -371,7 +373,7 @@ public class PowerUsageSummaryTest {
         when(mFragment.mBatteryTipPreferenceController.needUpdate()).thenReturn(true);
         mFragment.updateBatteryTipFlag(new Bundle());
 
-        mFragment.refreshUi();
+        mFragment.refreshUi(BatteryBroadcastReceiver.BatteryUpdateType.MANUAL);
 
         verify(mFragment).restartBatteryTipLoader();
     }