Merge "Update the battery broadcast receiver." into pi-dev
diff --git a/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
index ca4742d..3075d9b 100644
--- a/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
+++ b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
@@ -21,9 +21,14 @@
 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 @@
      * 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 @@
                 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);
             }
         }
     }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index 327a6c5..6493430 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -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.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 @@
                 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 @@
     }
 
     @Override
-    protected void refreshUi() {
+    protected void refreshUi(@BatteryUpdateType int refreshType) {
         final Context context = getContext();
         if (context == null) {
             return;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageBase.java b/src/com/android/settings/fuelgauge/PowerUsageBase.java
index b811f20..58d9d08 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageBase.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageBase.java
@@ -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 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 @@
         setHasOptionsMenu(true);
 
         mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(getContext());
-        mBatteryBroadcastReceiver.setBatteryChangedListener(() -> {
-            restartBatteryStatsLoader();
+        mBatteryBroadcastReceiver.setBatteryChangedListener(type -> {
+            restartBatteryStatsLoader(type);
         });
     }
 
@@ -81,11 +82,14 @@
         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 @@
         BatteryUtils.logRuntime(TAG, "updatePreference", startTime);
     }
 
-    @Override
-    public Loader<BatteryStatsHelper> onCreateLoader(int id,
-            Bundle args) {
-        return new BatteryStatsHelperLoader(getContext());
-    }
+    /**
+     * {@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 void onLoadFinished(Loader<BatteryStatsHelper> loader,
-            BatteryStatsHelper statsHelper) {
-        mStatsHelper = statsHelper;
-        refreshUi();
-    }
+        @Override
+        public Loader<BatteryStatsHelper> onCreateLoader(int id,
+                Bundle args) {
+            mRefreshType = args.getInt(KEY_REFRESH_TYPE);
+            return new BatteryStatsHelperLoader(getContext());
+        }
 
-    @Override
-    public void onLoaderReset(Loader<BatteryStatsHelper> loader) {
+        @Override
+        public void onLoadFinished(Loader<BatteryStatsHelper> loader,
+                BatteryStatsHelper statsHelper) {
+            mStatsHelper = statsHelper;
+            refreshUi(mRefreshType);
+        }
 
+        @Override
+        public void onLoaderReset(Loader<BatteryStatsHelper> loader) {
+
+        }
     }
 }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 0563815..e4f7a72 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -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 @@
                 } else {
                     mStatsType = BatteryStats.STATS_SINCE_CHARGED;
                 }
-                refreshUi();
+                refreshUi(BatteryUpdateType.MANUAL);
                 return true;
             case MENU_ADVANCED_BATTERY:
                 new SubSettingLauncher(getContext())
@@ -291,14 +293,15 @@
         }
     }
 
-    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 @@
     }
 
     @Override
-    protected void restartBatteryStatsLoader() {
-        restartBatteryStatsLoader(true /* clearHeader */);
+    protected void restartBatteryStatsLoader(@BatteryUpdateType int refreshType) {
+        super.restartBatteryStatsLoader(refreshType);
+        mBatteryHeaderPreferenceController.quickUpdateHeaderPreference();
     }
 
     @Override
@@ -407,13 +411,6 @@
         mBatteryTipPreferenceController.saveInstanceState(outState);
     }
 
-    void restartBatteryStatsLoader(boolean clearHeader) {
-        super.restartBatteryStatsLoader();
-        if (clearHeader) {
-            mBatteryHeaderPreferenceController.quickUpdateHeaderPreference();
-        }
-    }
-
     @Override
     public void onBatteryTipHandled(BatteryTip batteryTip) {
         restartBatteryTipLoader();
@@ -428,7 +425,7 @@
             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) {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
index 3fdbe83..4583dd1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
@@ -15,8 +15,11 @@
  */
 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 @@
     }
 
     @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 @@
         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 @@
 
         assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(batteryLevel);
         assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus);
-        verify(mBatteryListener, never()).onBatteryChanged();
+        verify(mBatteryListener, never()).onBatteryChanged(anyInt());
     }
 
     @Test
@@ -115,6 +118,6 @@
         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);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index 4a905b4..9b61e5f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -18,6 +18,7 @@
 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 @@
     @Test
     public void testOptionsMenu_menuAppToggle_metricEventInvoked() {
         mFragment.mShowAllApps = false;
-        doNothing().when(mFragment).restartBatteryStatsLoader();
+        doNothing().when(mFragment).restartBatteryStatsLoader(anyInt());
 
         mFragment.onOptionsItemSelected(mToggleAppsMenu);
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java
index d9f572d..eb683c0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java
@@ -74,7 +74,7 @@
         }
 
         @Override
-        protected void refreshUi() {
+        protected void refreshUi(int refreshType) {
             // Do nothing
         }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index b48f00e..07341a1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -149,7 +149,7 @@
         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 @@
     }
 
     @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 @@
         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 @@
         when(mFragment.mBatteryTipPreferenceController.needUpdate()).thenReturn(true);
         mFragment.updateBatteryTipFlag(new Bundle());
 
-        mFragment.refreshUi();
+        mFragment.refreshUi(BatteryBroadcastReceiver.BatteryUpdateType.MANUAL);
 
         verify(mFragment).restartBatteryTipLoader();
     }