Throttler for incidentd based on size putting into dropbox.

The incidentd will accumulate the total size put into dropbox and once
it exceeds a threshold (currently 20MB) daily, it will stop further
requests. It allows collection again 24 hours later.

Bug: 64219725
Test: atest incidentd_test and manually flashed incidentd and test.
Change-Id: Iea21fbae40d5d01108797b190231d73e74eff213
diff --git a/cmds/incidentd/src/Throttler.cpp b/cmds/incidentd/src/Throttler.cpp
new file mode 100644
index 0000000..1abf267
--- /dev/null
+++ b/cmds/incidentd/src/Throttler.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define DEBUG false
+#include "Log.h"
+
+#include "Throttler.h"
+
+#include <utils/SystemClock.h>
+
+Throttler::Throttler(size_t limit, int64_t refractoryPeriodMs)
+    : mSizeLimit(limit),
+      mRefractoryPeriodMs(refractoryPeriodMs),
+      mAccumulatedSize(0),
+      mLastRefractoryMs(android::elapsedRealtime()) {}
+
+Throttler::~Throttler() {}
+
+bool Throttler::shouldThrottle() {
+    int64_t now = android::elapsedRealtime();
+    if (now > mRefractoryPeriodMs + mLastRefractoryMs) {
+        mLastRefractoryMs = now;
+        mAccumulatedSize = 0;
+    }
+    return mAccumulatedSize > mSizeLimit;
+}
+
+void Throttler::addReportSize(size_t reportByteSize) {
+    VLOG("The current request took %d bytes to dropbox", (int)reportByteSize);
+    mAccumulatedSize += reportByteSize;
+}
+
+void Throttler::dump(FILE* out) {
+    fprintf(out, "mSizeLimit=%d\n", (int)mSizeLimit);
+    fprintf(out, "mAccumulatedSize=%d\n", (int)mAccumulatedSize);
+    fprintf(out, "mRefractoryPeriodMs=%d\n", (int)mRefractoryPeriodMs);
+    fprintf(out, "mLastRefractoryMs=%d\n", (int)mLastRefractoryMs);
+}