Merge "Access DeviceConfig as system_server" into tm-dev
diff --git a/statsd/src/flags/FlagProvider.h b/statsd/src/flags/FlagProvider.h
index 61d1841..4180e88 100644
--- a/statsd/src/flags/FlagProvider.h
+++ b/statsd/src/flags/FlagProvider.h
@@ -37,9 +37,6 @@
 const std::string STATSD_NATIVE_NAMESPACE = "statsd_native";
 const std::string STATSD_NATIVE_BOOT_NAMESPACE = "statsd_native_boot";
 
-const std::string VALUE_METRIC_SUBSET_DIMENSION_AGGREGATION_FLAG =
-        "value_metric_subset_dimension_aggregation";
-
 const std::string FLAG_TRUE = "true";
 const std::string FLAG_FALSE = "false";
 const std::string FLAG_EMPTY = "";
@@ -112,7 +109,6 @@
     friend class FlagProviderTest_SPlus_RealValues;
     friend class KllMetricE2eAbTest;
     friend class MetricsManagerTest;
-    friend class NumericValueMetricProducerTest_SubsetDimensions;
     friend class PartialBucketE2e_AppUpgradeDefaultTest;
 
     FRIEND_TEST(ConfigUpdateE2eTest, TestKllMetric_KllDisabledBeforeConfigUpdate);
@@ -129,8 +125,7 @@
     FRIEND_TEST(FlagProviderTest_SPlus, TestGetFlagBoolServerFlagEmptyDefaultTrue);
     FRIEND_TEST(FlagProviderTest_SPlus_RealValues, TestGetBootFlagBoolServerFlagTrue);
     FRIEND_TEST(FlagProviderTest_SPlus_RealValues, TestGetBootFlagBoolServerFlagFalse);
-    FRIEND_TEST(NumericValueMetricProducerTest_SubsetDimensions, TestSubsetDimensions_FlagTrue);
-    FRIEND_TEST(NumericValueMetricProducerTest_SubsetDimensions, TestSubsetDimensions_FlagFalse);
+    FRIEND_TEST(NumericValueMetricProducerTest_SubsetDimensions, TestSubsetDimensions);
     FRIEND_TEST(PartialBucketE2e_AppUpgradeDefaultTest, TestCountMetricDefaultFalse);
     FRIEND_TEST(PartialBucketE2e_AppUpgradeDefaultTest, TestCountMetricDefaultTrue);
 };
diff --git a/statsd/src/main.cpp b/statsd/src/main.cpp
index 01e1e92..bd2c0e4 100644
--- a/statsd/src/main.cpp
+++ b/statsd/src/main.cpp
@@ -80,7 +80,7 @@
             std::make_shared<LogEventQueue>(4000 /*buffer limit. Buffer is NOT pre-allocated*/);
 
     // Initialize boot flags
-    FlagProvider::getInstance().initBootFlags({VALUE_METRIC_SUBSET_DIMENSION_AGGREGATION_FLAG});
+    FlagProvider::getInstance().initBootFlags({});
 
     // Create the service
     gStatsService = SharedRefBase::make<StatsService>(looper, eventQueue);
diff --git a/statsd/src/metrics/NumericValueMetricProducer.cpp b/statsd/src/metrics/NumericValueMetricProducer.cpp
index f2e93f1..703b07b 100644
--- a/statsd/src/metrics/NumericValueMetricProducer.cpp
+++ b/statsd/src/metrics/NumericValueMetricProducer.cpp
@@ -22,7 +22,6 @@
 #include <limits.h>
 #include <stdlib.h>
 
-#include "flags/FlagProvider.h"
 #include "guardrail/StatsdStats.h"
 #include "metrics/parsing_utils/metrics_manager_util.h"
 #include "stats_log_util.h"
@@ -254,9 +253,9 @@
     }
 
     mMatchedMetricDimensionKeys.clear();
-    if (FlagProvider::getInstance().getBootFlagBool(VALUE_METRIC_SUBSET_DIMENSION_AGGREGATION_FLAG,
-                                                    FLAG_FALSE) &&
-        mUseDiff) {
+    if (mUseDiff) {
+        // An extra aggregation step is needed to sum values with matching dimensions
+        // before calculating the diff between sums of consecutive pulls.
         std::unordered_map<HashableDimensionKey, pair<LogEvent, vector<int>>> aggregateEvents;
         for (const auto& data : allData) {
             if (mEventMatcherWizard->matchLogEvent(*data, mWhatMatcherIndex) !=
diff --git a/statsd/src/metrics/NumericValueMetricProducer.h b/statsd/src/metrics/NumericValueMetricProducer.h
index 542975d..8eca3f8 100644
--- a/statsd/src/metrics/NumericValueMetricProducer.h
+++ b/statsd/src/metrics/NumericValueMetricProducer.h
@@ -264,7 +264,7 @@
     FRIEND_TEST(NumericValueMetricProducerTest_ConditionCorrection, TestThresholdUploadSkip);
     FRIEND_TEST(NumericValueMetricProducerTest_ConditionCorrection, TestLateStateChangeSlicedAtoms);
 
-    FRIEND_TEST(NumericValueMetricProducerTest_SubsetDimensions, TestSubsetDimensions_FlagTrue);
+    FRIEND_TEST(NumericValueMetricProducerTest, TestSubsetDimensions);
 
     FRIEND_TEST(ConfigUpdateTest, TestUpdateValueMetrics);
 
diff --git a/statsd/tests/metrics/NumericValueMetricProducer_test.cpp b/statsd/tests/metrics/NumericValueMetricProducer_test.cpp
index 1457292..1b5abaf 100644
--- a/statsd/tests/metrics/NumericValueMetricProducer_test.cpp
+++ b/statsd/tests/metrics/NumericValueMetricProducer_test.cpp
@@ -274,19 +274,6 @@
 // Setup for parameterized tests.
 class NumericValueMetricProducerTest_PartialBucket : public TestWithParam<BucketSplitEvent> {};
 
-class NumericValueMetricProducerTest_SubsetDimensions : public ::testing::Test {
-    void SetUp() override {
-        FlagProvider::getInstance().overrideFuncs(&isAtLeastSFuncTrue);
-        FlagProvider::getInstance().overrideFlag(VALUE_METRIC_SUBSET_DIMENSION_AGGREGATION_FLAG,
-                                                 FLAG_FALSE,
-                                                 /*isBootFlag=*/true);
-    }
-
-    void TearDown() override {
-        FlagProvider::getInstance().resetOverrides();
-    }
-};
-
 INSTANTIATE_TEST_SUITE_P(NumericValueMetricProducerTest_PartialBucket,
                          NumericValueMetricProducerTest_PartialBucket,
                          testing::Values(APP_UPGRADE, BOOT_COMPLETE));
@@ -7353,10 +7340,7 @@
                         60 * NS_PER_SEC, 0);
 }
 
-TEST_F(NumericValueMetricProducerTest_SubsetDimensions, TestSubsetDimensions_FlagTrue) {
-    FlagProvider::getInstance().overrideFlag(VALUE_METRIC_SUBSET_DIMENSION_AGGREGATION_FLAG,
-                                             FLAG_TRUE, /*isBootFlag=*/true);
-
+TEST(NumericValueMetricProducerTest, TestSubsetDimensions) {
     // Create metric with subset of dimensions.
     ValueMetric metric = NumericValueMetricProducerTestHelper::createMetric();
     *metric.mutable_dimensions_in_what() = CreateDimensions(tagId, {1 /*uid*/});
@@ -7442,92 +7426,6 @@
     ValidateValueBucket(data.bucket_info(1), bucket2StartTimeNs, dumpReportTimeNs, {26}, -1, 0);
 }
 
-TEST_F(NumericValueMetricProducerTest_SubsetDimensions, TestSubsetDimensions_FlagFalse) {
-    // Create metric with subset of dimensions.
-    ValueMetric metric = NumericValueMetricProducerTestHelper::createMetric();
-    *metric.mutable_dimensions_in_what() = CreateDimensions(tagId, {1 /*uid*/});
-
-    sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-
-    EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _))
-            // First and third fields are dimension fields. Second field is the value field.
-            // First bucket pull.
-            .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs,
-                                vector<std::shared_ptr<LogEvent>>* data) {
-                data->clear();
-                data->push_back(
-                        CreateThreeValueLogEvent(tagId, bucketStartTimeNs + 1, 1 /*uid*/, 5, 5));
-                data->push_back(
-                        CreateThreeValueLogEvent(tagId, bucketStartTimeNs + 1, 1 /*uid*/, 5, 7));
-                data->push_back(
-                        CreateThreeValueLogEvent(tagId, bucketStartTimeNs + 1, 2 /*uid*/, 6, 5));
-                data->push_back(
-                        CreateThreeValueLogEvent(tagId, bucketStartTimeNs + 1, 2 /*uid*/, 6, 7));
-                return true;
-            }))
-            // Dump report.
-            .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs,
-                                vector<std::shared_ptr<LogEvent>>* data) {
-                data->clear();
-                data->push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 10000000000,
-                                                         1 /*uid*/, 13, 5));
-                data->push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 10000000000,
-                                                         1 /*uid*/, 15, 7));
-                data->push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 10000000000,
-                                                         2 /*uid*/, 21, 5));
-                data->push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 10000000000,
-                                                         2 /*uid*/, 22, 7));
-                return true;
-            }));
-
-    sp<NumericValueMetricProducer> valueProducer =
-            NumericValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager,
-                                                                                  metric);
-
-    // Bucket 2 start.
-    vector<shared_ptr<LogEvent>> allData;
-    allData.clear();
-    allData.push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 1, 1 /*uid*/, 10, 5));
-    allData.push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 1, 1 /*uid*/, 11, 7));
-    allData.push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 1, 2 /*uid*/, 8, 5));
-    allData.push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 1, 2 /*uid*/, 9, 7));
-    valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs);
-
-    // Check dump report.
-    ProtoOutputStream output;
-    std::set<string> strSet;
-    int64_t dumpReportTimeNs = bucket2StartTimeNs + 10000000000;
-    valueProducer->onDumpReport(dumpReportTimeNs, true /* include current buckets */, true,
-                                NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output);
-
-    StatsLogReport report = outputStreamToProto(&output);
-    backfillDimensionPath(&report);
-    backfillStartEndTimestamp(&report);
-    EXPECT_TRUE(report.has_value_metrics());
-    StatsLogReport::ValueMetricDataWrapper valueMetrics;
-    sortMetricDataByDimensionsValue(report.value_metrics(), &valueMetrics);
-    ASSERT_EQ(2, valueMetrics.data_size());
-    EXPECT_EQ(0, report.value_metrics().skipped_size());
-
-    // Check data keyed to uid 1.
-    ValueMetricData data = valueMetrics.data(0);
-    ValidateUidDimension(data.dimensions_in_what(), tagId, 1);
-    ASSERT_EQ(2, data.bucket_info_size());
-    ValidateValueBucket(data.bucket_info(0), bucketStartTimeNs, bucket2StartTimeNs, {6}, -1,
-                        0);  // Summed diffs of 5, 5, 10, 11
-    ValidateValueBucket(data.bucket_info(1), bucket2StartTimeNs, dumpReportTimeNs, {4}, -1,
-                        0);  // Summed diffs of 11, 13, 15
-
-    // Check data keyed to uid 2.
-    data = valueMetrics.data(1);
-    ValidateUidDimension(data.dimensions_in_what(), tagId, 2);
-    ASSERT_EQ(2, data.bucket_info_size());
-    ValidateValueBucket(data.bucket_info(0), bucketStartTimeNs, bucket2StartTimeNs, {3}, -1,
-                        0);  // Summed diffs of 6, 6, 8, 9
-    ValidateValueBucket(data.bucket_info(1), bucket2StartTimeNs, dumpReportTimeNs, {13}, -1,
-                        0);  // Summed diffs of 9, 21, 22
-}
-
 TEST(NumericValueMetricProducerTest, TestRepeatedValueFieldAndDimensions) {
     ValueMetric metric = NumericValueMetricProducerTestHelper::createMetricWithRepeatedValueField();
     metric.mutable_dimensions_in_what()->set_field(tagId);