Merge "Check the timestamp by areaId" into qt-qpr1-dev am: a60cc51cc7
Change-Id: I811efa0cf7ee5df05bd13a25e153f074ba4b7b23
diff --git a/car-lib/src/android/car/hardware/property/CarPropertyManager.java b/car-lib/src/android/car/hardware/property/CarPropertyManager.java
index 9065b9a..dafa8bc 100644
--- a/car-lib/src/android/car/hardware/property/CarPropertyManager.java
+++ b/car-lib/src/android/car/hardware/property/CarPropertyManager.java
@@ -694,11 +694,11 @@
void onPropertyChanged(final CarPropertyEvent event) {
// throw away old sensor data as oneway binder call can change order.
long updateTime = event.getCarPropertyValue().getTimestamp();
- if (updateTime < mLastUpdateTime) {
+ int areaId = event.getCarPropertyValue().getAreaId();
+ if (!needUpdateForAreaId(areaId, updateTime)) {
Log.w(TAG, "dropping old property data");
return;
}
- mLastUpdateTime = updateTime;
List<CarPropertyEventCallback> listeners;
synchronized (mActivePropertyListener) {
listeners = new ArrayList<>(getListeners());
@@ -706,7 +706,7 @@
listeners.forEach(new Consumer<CarPropertyEventCallback>() {
@Override
public void accept(CarPropertyEventCallback listener) {
- if (needUpdate(listener, updateTime)) {
+ if (needUpdateForSelectedListener(listener, updateTime)) {
listener.onChangeEvent(event.getCarPropertyValue());
}
}
diff --git a/car-lib/src/com/android/car/internal/CarRatedFloatListeners.java b/car-lib/src/com/android/car/internal/CarRatedFloatListeners.java
index 93519d6..566eed7 100644
--- a/car-lib/src/com/android/car/internal/CarRatedFloatListeners.java
+++ b/car-lib/src/com/android/car/internal/CarRatedFloatListeners.java
@@ -16,6 +16,8 @@
package com.android.car.internal;
+import android.util.SparseArray;
+
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -36,7 +38,8 @@
private float mUpdateRate;
- protected long mLastUpdateTime = -1;
+ // key: areaId, value: lastUpdateTime in nanosecond
+ protected SparseArray<Long> mAreaIdToLastUpdateTime = new SparseArray<>();
protected CarRatedFloatListeners(float rate) {
mUpdateRate = rate;
@@ -105,7 +108,7 @@
* @param eventTimeStamp
* @return true if listener need to be notified.
*/
- public boolean needUpdate(T listener, long eventTimeStamp) {
+ public boolean needUpdateForSelectedListener(T listener, long eventTimeStamp) {
Long nextUpdateTime = mListenersUpdateTime.get(listener);
Float updateRate = mListenersToRate.get(listener);
/** Update ON_CHANGE property. */
@@ -121,6 +124,21 @@
return false;
}
+ /**
+ * @param areaId AreaId in CarPropertyValue
+ * @param eventTime TimeStamp in CarPropertyValue
+ * @return true if eventTime is greater than the last event time for the same areaId.
+ */
+ public boolean needUpdateForAreaId(int areaId, long eventTime) {
+ long lastUpdateTime = mAreaIdToLastUpdateTime.get(areaId, 0L);
+ if (eventTime >= lastUpdateTime) {
+ mAreaIdToLastUpdateTime.put(areaId, eventTime);
+ return true;
+ }
+ return false;
+ }
+
+
public Collection<T> getListeners() {
return mListenersToRate.keySet();
}