Merge "Adds strings for Swipe Up gesture in Settings" into pi-dev
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
index dcacaae..bad1c11 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
@@ -48,13 +48,4 @@
             }
         }
     }
-
-    @VisibleForTesting
-    void uploadPendingIntent(StatsManager statsManager, PendingIntent pendingIntent) {
-        Log.i(TAG, "Upload PendingIntent to StatsManager. configKey: "
-                + StatsManagerConfig.ANOMALY_CONFIG_KEY + " subId: "
-                + StatsManagerConfig.SUBSCRIBER_ID);
-        statsManager.setBroadcastSubscriber(StatsManagerConfig.ANOMALY_CONFIG_KEY,
-                StatsManagerConfig.SUBSCRIBER_ID, pendingIntent);
-    }
 }
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index 2b04173..7720dcc 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -59,9 +59,11 @@
 /** A JobService to store anomaly data to anomaly database */
 public class AnomalyDetectionJobService extends JobService {
     private static final String TAG = "AnomalyDetectionService";
-    private static final int UID_NULL = 0;
-    private static final int STATSD_UID_FILED = 1;
     private static final int ON = 1;
+    @VisibleForTesting
+    static final int UID_NULL = -1;
+    @VisibleForTesting
+    static final int STATSD_UID_FILED = 1;
 
     @VisibleForTesting
     static final long MAX_DELAY_MS = TimeUnit.MINUTES.toMillis(30);
@@ -143,7 +145,8 @@
                     : Settings.Global.getInt(contentResolver,
                             Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON;
             final String packageName = batteryUtils.getPackageName(uid);
-            if (!isSystemUid(uid) && !powerWhitelistBackend.isSysWhitelistedExceptIdle(
+            if (uid != UID_NULL && !isSystemUid(uid)
+                    && !powerWhitelistBackend.isSysWhitelistedExceptIdle(
                     packageManager.getPackagesForUid(uid))) {
                 boolean anomalyDetected = true;
                 if (anomalyInfo.anomalyType
@@ -191,7 +194,6 @@
      */
     @VisibleForTesting
     int extractUidFromStatsDimensionsValue(StatsDimensionsValue statsDimensionsValue) {
-        //TODO(b/73172999): Add robo test for this method
         if (statsDimensionsValue == null) {
             return UID_NULL;
         }
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 dbca602..55a8f4e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -16,6 +16,10 @@
 
 package com.android.settings.fuelgauge.batterytip;
 
+import static android.os.StatsDimensionsValue.FLOAT_VALUE_TYPE;
+import static android.os.StatsDimensionsValue.INT_VALUE_TYPE;
+import static android.os.StatsDimensionsValue.TUPLE_VALUE_TYPE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Matchers.any;
@@ -24,9 +28,11 @@
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 import static org.robolectric.RuntimeEnvironment.application;
 
 import android.app.StatsManager;
@@ -35,6 +41,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.os.Process;
 import android.os.StatsDimensionsValue;
 import android.os.UserManager;
@@ -149,6 +157,21 @@
     }
 
     @Test
+    public void testSaveAnomalyToDatabase_uidNull_doNotSave() {
+        doReturn(AnomalyDetectionJobService.UID_NULL).when(
+                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
+
+        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
+                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
+                mPowerWhitelistBackend, mContext.getContentResolver(),
+                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+                mBundle);
+
+        verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
+                anyInt(), anyLong());
+    }
+
+    @Test
     public void testSaveAnomalyToDatabase_normalAppWithAutoRestriction_save() {
         final ArrayList<String> cookies = new ArrayList<>();
         cookies.add(SUBSCRIBER_COOKIES_AUTO_RESTRICTION);
@@ -196,4 +219,35 @@
                 SYSTEM_PACKAGE,
                 Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE));
     }
+
+    @Test
+    public void testExtractUidFromStatsDimensionsValue_extractCorrectUid() {
+        // Build an integer dimensions value.
+        final StatsDimensionsValue intValue = mock(StatsDimensionsValue.class);
+        when(intValue.isValueType(INT_VALUE_TYPE)).thenReturn(true);
+        when(intValue.getField()).thenReturn(AnomalyDetectionJobService.STATSD_UID_FILED);
+        when(intValue.getIntValue()).thenReturn(UID);
+
+        // Build a tuple dimensions value and put the previous integer dimensions value inside.
+        final StatsDimensionsValue tupleValue = mock(StatsDimensionsValue.class);
+        when(tupleValue.isValueType(TUPLE_VALUE_TYPE)).thenReturn(true);
+        final List<StatsDimensionsValue> statsDimensionsValues = new ArrayList<>();
+        statsDimensionsValues.add(intValue);
+        when(tupleValue.getTupleValueList()).thenReturn(statsDimensionsValues);
+
+        assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue(
+                tupleValue)).isEqualTo(UID);
+    }
+
+    @Test
+    public void testExtractUidFromStatsDimensionsValue_wrongFormat_returnNull() {
+        // Build a float dimensions value
+        final StatsDimensionsValue floatValue = mock(StatsDimensionsValue.class);
+        when(floatValue.isValueType(FLOAT_VALUE_TYPE)).thenReturn(true);
+        when(floatValue.getField()).thenReturn(AnomalyDetectionJobService.STATSD_UID_FILED);
+        when(floatValue.getFloatValue()).thenReturn(0f);
+
+        assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue(
+                floatValue)).isEqualTo(AnomalyDetectionJobService.UID_NULL);
+    }
 }