Merge "Add Intentfilter BasePreferenceController" into pi-dev
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index a1f5df2..c62af8f 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -45,6 +45,8 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
+import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
+import com.android.settings.fuelgauge.batterytip.StatsManagerConfig;
 import com.android.settings.overlay.FeatureFactory;
 
 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
@@ -511,10 +513,25 @@
         return false;
     }
 
+    public boolean isPreOApp(final String[] packageNames) {
+        if (ArrayUtils.isEmpty(packageNames)) {
+            return false;
+        }
+
+        for (String packageName : packageNames) {
+            if (isPreOApp(packageName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     /**
      * Return {@code true} if we should hide anomaly app represented by {@code uid}
      */
-    public boolean shouldHideAnomaly(PowerWhitelistBackend powerWhitelistBackend, int uid) {
+    public boolean shouldHideAnomaly(PowerWhitelistBackend powerWhitelistBackend, int uid,
+            AnomalyInfo anomalyInfo) {
         final String[] packageNames = mPackageManager.getPackagesForUid(uid);
         if (ArrayUtils.isEmpty(packageNames)) {
             // Don't show it if app has been uninstalled
@@ -522,7 +539,13 @@
         }
 
         return isSystemUid(uid) || powerWhitelistBackend.isWhitelisted(packageNames)
-                || (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames));
+                || (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames))
+                || (isExcessiveBackgroundAnomaly(anomalyInfo) && !isPreOApp(packageNames));
+    }
+
+    private boolean isExcessiveBackgroundAnomaly(AnomalyInfo anomalyInfo) {
+        return anomalyInfo.anomalyType
+                == StatsManagerConfig.AnomalyType.EXCESSIVE_BACKGROUND_SERVICE;
     }
 
     private boolean isSystemUid(int uid) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index b6bcd54..84ef864 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -155,44 +155,36 @@
             final String packageName = batteryUtils.getPackageName(uid);
             final long versionCode = batteryUtils.getAppLongVersionCode(packageName);
 
-            final boolean anomalyDetected;
-            if (isExcessiveBackgroundAnomaly(anomalyInfo)) {
-                anomalyDetected = batteryUtils.isPreOApp(packageName);
+            if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid, anomalyInfo)) {
+                metricsFeatureProvider.action(context,
+                        MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
+                        packageName,
+                        Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,
+                                anomalyInfo.anomalyType),
+                        Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
+                                versionCode));
             } else {
-                anomalyDetected = true;
+                if (autoFeatureOn && anomalyInfo.autoRestriction) {
+                    // Auto restrict this app
+                    batteryUtils.setForceAppStandby(uid, packageName,
+                            AppOpsManager.MODE_IGNORED);
+                    databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
+                            AnomalyDatabaseHelper.State.AUTO_HANDLED,
+                            timeMs);
+                } else {
+                    databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
+                            AnomalyDatabaseHelper.State.NEW,
+                            timeMs);
+                }
+                metricsFeatureProvider.action(context,
+                        MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
+                        packageName,
+                        Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
+                                anomalyInfo.anomalyType),
+                        Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
+                                versionCode));
             }
 
-            if (anomalyDetected) {
-                if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid)) {
-                    metricsFeatureProvider.action(context,
-                            MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
-                            packageName,
-                            Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,
-                                    anomalyInfo.anomalyType),
-                            Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
-                                    versionCode));
-                } else {
-                    if (autoFeatureOn && anomalyInfo.autoRestriction) {
-                        // Auto restrict this app
-                        batteryUtils.setForceAppStandby(uid, packageName,
-                                AppOpsManager.MODE_IGNORED);
-                        databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
-                                AnomalyDatabaseHelper.State.AUTO_HANDLED,
-                                timeMs);
-                    } else {
-                        databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
-                                AnomalyDatabaseHelper.State.NEW,
-                                timeMs);
-                    }
-                    metricsFeatureProvider.action(context,
-                            MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
-                            packageName,
-                            Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
-                                    anomalyInfo.anomalyType),
-                            Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
-                                    versionCode));
-                }
-            }
         } catch (NullPointerException | IndexOutOfBoundsException e) {
             Log.e(TAG, "Parse stats dimensions value error.", e);
         }
@@ -229,11 +221,6 @@
         return UID_NULL;
     }
 
-    private boolean isExcessiveBackgroundAnomaly(AnomalyInfo anomalyInfo) {
-        return anomalyInfo.anomalyType
-                == StatsManagerConfig.AnomalyType.EXCESSIVE_BACKGROUND_SERVICE;
-    }
-
     @VisibleForTesting
     JobWorkItem dequeueWork(JobParameters parameters) {
         synchronized (mLock) {
diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java
index 6d9d3a4..62f3453 100644
--- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java
+++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java
@@ -136,7 +136,7 @@
             final BluetoothDevice btDevice = mConnectedDevices.get(connectedDeviceIndex);
             mSelectedIndex = connectedDeviceIndex;
             setActiveBluetoothDevice(btDevice);
-            listPreference.setSummary(btDevice.getName());
+            listPreference.setSummary(btDevice.getAliasName());
         }
         return true;
     }
@@ -328,7 +328,7 @@
         mediaValues[mSelectedIndex] = mContext.getText(R.string.media_output_default_summary);
         for (int i = 0, size = mConnectedDevices.size(); i < size; i++) {
             final BluetoothDevice btDevice = mConnectedDevices.get(i);
-            mediaOutputs[i] = btDevice.getName();
+            mediaOutputs[i] = btDevice.getAliasName();
             mediaValues[i] = btDevice.getAddress();
             if (btDevice.equals(activeDevice)) {
                 // select the active connected device.
diff --git a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
index 2039913..f7f547a 100644
--- a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
+++ b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java
@@ -66,7 +66,11 @@
         if (numDevices == 0) {
             // No connected devices, disable switch entry.
             mPreference.setVisible(false);
-            preference.setSummary(mContext.getText(R.string.media_output_default_summary));
+            final CharSequence summary = mContext.getText(R.string.media_output_default_summary);
+            final CharSequence[] defaultMediaOutput = new CharSequence[]{summary};
+            mSelectedIndex = getDefaultDeviceIndex();
+            preference.setSummary(summary);
+            setPreference(defaultMediaOutput, defaultMediaOutput, preference);
             return;
         }
 
diff --git a/src/com/android/settings/sound/MediaOutputPreferenceController.java b/src/com/android/settings/sound/MediaOutputPreferenceController.java
index 79f3c9d..b456263 100644
--- a/src/com/android/settings/sound/MediaOutputPreferenceController.java
+++ b/src/com/android/settings/sound/MediaOutputPreferenceController.java
@@ -78,7 +78,11 @@
         if (numDevices == 0) {
             // Disable switch entry if there is no connected devices.
             mPreference.setVisible(false);
-            preference.setSummary(mContext.getText(R.string.media_output_default_summary));
+            final CharSequence summary = mContext.getText(R.string.media_output_default_summary);
+            final CharSequence[] defaultMediaOutput = new CharSequence[]{summary};
+            mSelectedIndex = getDefaultDeviceIndex();
+            preference.setSummary(summary);
+            setPreference(defaultMediaOutput, defaultMediaOutput, preference);
             return;
         }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index 4fd3a82..ac0b25a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -53,6 +53,8 @@
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.R;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
+import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
+import com.android.settings.fuelgauge.batterytip.StatsManagerConfig;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
@@ -106,6 +108,9 @@
     private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
     private static final String LOW_SDK_PACKAGE = "com.android.package.low";
 
+    private static final String INFO_EXCESSIVE = "anomaly_type=4,auto_restriction=false";
+    private static final String INFO_WAKELOCK = "anomaly_type=1,auto_restriction=false";
+
     @Mock
     private BatteryStats.Uid mUid;
     @Mock
@@ -146,6 +151,7 @@
     private ApplicationInfo mLowApplicationInfo;
     @Mock
     private PowerWhitelistBackend mPowerWhitelistBackend;
+    private AnomalyInfo mAnomalyInfo;
     private BatteryUtils mBatteryUtils;
     private FakeFeatureFactory mFeatureFactory;
     private PowerUsageFeatureProvider mProvider;
@@ -211,6 +217,7 @@
         mBatteryUtils.mPowerUsageFeatureProvider = mProvider;
         doReturn(0L).when(mBatteryUtils)
             .getForegroundServiceTotalTimeUs(any(BatteryStats.Uid.class), anyLong());
+        mAnomalyInfo = new AnomalyInfo(INFO_WAKELOCK);
 
         mUsageList = new ArrayList<>();
         mUsageList.add(mNormalBatterySipper);
@@ -532,16 +539,27 @@
     }
 
     @Test
-    public void testIsLegacyApp_SdkLowerThanO_ReturnTrue() {
+    public void testIsPreOApp_SdkLowerThanO_ReturnTrue() {
         assertThat(mBatteryUtils.isPreOApp(LOW_SDK_PACKAGE)).isTrue();
     }
 
     @Test
-    public void testIsLegacyApp_SdkLargerOrEqualThanO_ReturnFalse() {
+    public void testIsPreOApp_SdkLargerOrEqualThanO_ReturnFalse() {
         assertThat(mBatteryUtils.isPreOApp(HIGH_SDK_PACKAGE)).isFalse();
     }
 
     @Test
+    public void testIsPreOApp_containPreOApp_ReturnTrue() {
+        assertThat(
+                mBatteryUtils.isPreOApp(new String[]{HIGH_SDK_PACKAGE, LOW_SDK_PACKAGE})).isTrue();
+    }
+
+    @Test
+    public void testIsPreOApp_emptyList_ReturnFalse() {
+        assertThat(mBatteryUtils.isPreOApp(new String[]{})).isFalse();
+    }
+
+    @Test
     public void testSetForceAppStandby_forcePreOApp_forceTwoRestrictions() {
         mBatteryUtils.setForceAppStandby(UID, LOW_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
 
@@ -591,7 +609,8 @@
         doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
         mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
 
-        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isTrue();
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
+                mAnomalyInfo)).isTrue();
     }
 
     @Test
@@ -600,7 +619,8 @@
         doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
         mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
 
-        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isTrue();
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
+                mAnomalyInfo)).isTrue();
     }
 
     @Test
@@ -608,7 +628,8 @@
         final int systemUid = Process.ROOT_UID;
         doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(systemUid);
 
-        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, systemUid)).isTrue();
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, systemUid,
+                mAnomalyInfo)).isTrue();
     }
 
     @Test
@@ -616,13 +637,33 @@
         doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
         doReturn(true).when(mPowerWhitelistBackend).isWhitelisted(new String[]{HIGH_SDK_PACKAGE});
 
-        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isTrue();
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
+                mAnomalyInfo)).isTrue();
     }
 
     @Test
     public void testShouldHideAnomaly_normalApp_returnFalse() {
         doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
 
-        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isFalse();
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
+                mAnomalyInfo)).isFalse();
+    }
+
+    @Test
+    public void testShouldHideAnomaly_excessivePriorOApp_returnFalse() {
+        doReturn(new String[]{LOW_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+        mAnomalyInfo = new AnomalyInfo(INFO_EXCESSIVE);
+
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
+                mAnomalyInfo)).isFalse();
+    }
+
+    @Test
+    public void testShouldHideAnomaly_excessiveOApp_returnTrue() {
+        doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+        mAnomalyInfo = new AnomalyInfo(INFO_EXCESSIVE);
+
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
+                mAnomalyInfo)).isTrue();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
index 8df1f21..b55bf6b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -165,7 +165,7 @@
         doReturn(false).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
         doReturn(Process.FIRST_APPLICATION_UID).when(
                 mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
-        doReturn(true).when(mBatteryUtils).shouldHideAnomaly(any(), anyInt());
+        doReturn(true).when(mBatteryUtils).shouldHideAnomaly(any(), anyInt(), any());
 
         mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
                 mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
diff --git a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
index 272fd20..7eccd42 100644
--- a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
@@ -226,7 +226,7 @@
 
         mController.onPreferenceChange(mPreference, TEST_DEVICE_ADDRESS_1);
 
-        assertThat(mPreference.getSummary()).isEqualTo(mBluetoothDevice.getName());
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME_1);
     }
 
     /**
@@ -246,7 +246,7 @@
 
         mController.onPreferenceChange(mPreference, TEST_DEVICE_ADDRESS_2);
 
-        assertThat(mPreference.getSummary()).isEqualTo(secondBluetoothDevice.getName());
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME_2);
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java
index 6a573e0..614bcce 100644
--- a/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java
@@ -253,7 +253,7 @@
         mController.updateState(mPreference);
 
         assertThat(mPreference.isVisible()).isTrue();
-        assertThat(mPreference.getSummary()).isEqualTo(mBluetoothDevice.getName());
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME_1);
     }
 
     /**
@@ -275,7 +275,7 @@
         mController.updateState(mPreference);
 
         assertThat(mPreference.isVisible()).isTrue();
-        assertThat(mPreference.getSummary()).isEqualTo(mSecondBluetoothDevice.getName());
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME_2);
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
index 6aec5ef..4dd809c 100644
--- a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
@@ -305,7 +305,7 @@
         mController.updateState(mPreference);
 
         assertThat(mPreference.isVisible()).isTrue();
-        assertThat(mPreference.getSummary()).isEqualTo(mBluetoothDevice.getName());
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME_1);
     }
 
     /**
@@ -326,7 +326,7 @@
         mController.updateState(mPreference);
 
         assertThat(mPreference.isVisible()).isTrue();
-        assertThat(mPreference.getSummary()).isEqualTo(mSecondBluetoothDevice.getName());
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME_2);
     }
 
     /**