SurfaceFlinger: Add DISPLAY_EVENT_FRAME_RATE_OVERRIDE

Add a new event to DisplayEventReceiver that conveys a list
of apps whose frame rates have been overriden.
This event is processed by the DisplayManager to advertise the
new frame rate to the overridden app.

Change-Id: I89fce8b5b4d9db65ec5db7dd2393c384c0fcfd82
Bug: 169271059
Bug: 169271062
Bug: 170503758
Test: manual test using SF backdoor
diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
index b872d7a..8b4283c 100644
--- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
+++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp
@@ -687,21 +687,20 @@
     return RefreshRateConfigs::KernelIdleTimerAction::TurnOn;
 }
 
-void RefreshRateConfigs::setPreferredRefreshRateForUid(uid_t uid, float refreshRateHz) {
-    if (refreshRateHz > 0 && refreshRateHz < 1) {
+void RefreshRateConfigs::setPreferredRefreshRateForUid(FrameRateOverride frameRateOverride) {
+    if (frameRateOverride.frameRateHz > 0 && frameRateOverride.frameRateHz < 1) {
         return;
     }
 
     std::lock_guard lock(mLock);
-    if (refreshRateHz != 0) {
-        mPreferredRefreshRateForUid[uid] = refreshRateHz;
+    if (frameRateOverride.frameRateHz != 0) {
+        mPreferredRefreshRateForUid[frameRateOverride.uid] = frameRateOverride.frameRateHz;
     } else {
-        mPreferredRefreshRateForUid.erase(uid);
+        mPreferredRefreshRateForUid.erase(frameRateOverride.uid);
     }
 }
 
 int RefreshRateConfigs::getRefreshRateDividerForUid(uid_t uid) const {
-    constexpr float kThreshold = 0.1f;
     std::lock_guard lock(mLock);
 
     const auto iter = mPreferredRefreshRateForUid.find(uid);
@@ -709,6 +708,9 @@
         return 1;
     }
 
+    // This calculation needs to be in sync with the java code
+    // in DisplayManagerService.getDisplayInfoForFrameRateOverride
+    constexpr float kThreshold = 0.1f;
     const auto refreshRateHz = iter->second;
     const auto numPeriods = mCurrentRefreshRate->getFps() / refreshRateHz;
     const auto numPeriodsRounded = std::round(numPeriods);
@@ -716,7 +718,19 @@
         return 1;
     }
 
-    return static_cast<int>(numPeriods);
+    return static_cast<int>(numPeriodsRounded);
+}
+
+std::vector<FrameRateOverride> RefreshRateConfigs::getFrameRateOverrides() {
+    std::lock_guard lock(mLock);
+    std::vector<FrameRateOverride> overrides;
+    overrides.reserve(mPreferredRefreshRateForUid.size());
+
+    for (const auto [uid, frameRate] : mPreferredRefreshRateForUid) {
+        overrides.emplace_back(FrameRateOverride{uid, frameRate});
+    }
+
+    return overrides;
 }
 
 void RefreshRateConfigs::dump(std::string& result) const {