14d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik/* 24d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * Copyright (C) 2018 The Android Open Source Project 34d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * 44d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * Licensed under the Apache License, Version 2.0 (the "License"); 54d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * you may not use this file except in compliance with the License. 64d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * You may obtain a copy of the License at 74d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * 84d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * http://www.apache.org/licenses/LICENSE-2.0 94d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * 104d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * Unless required by applicable law or agreed to in writing, software 114d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * distributed under the License is distributed on an "AS IS" BASIS, 124d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * See the License for the specific language governing permissions and 144d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * limitations under the License. 154d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik */ 164d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 174d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paikpackage com.android.car.internal; 184d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 194d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paikimport java.util.Collection; 204d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paikimport java.util.Collections; 214d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paikimport java.util.HashMap; 224d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paikimport java.util.Map; 234d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 244d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik/** 254d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * Represent listeners for a property grouped by their rate. 26da0eecb6294719791537bd8de5b881e35355bc86Kai * T is a type of EventListener such as CarPropertyEventListener 27da0eecb6294719791537bd8de5b881e35355bc86Kai * in {@link android.car.hardware.property.CarPropertyManager} 28da0eecb6294719791537bd8de5b881e35355bc86Kai * @param <T> 294d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * @hide 304d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik */ 31da0eecb6294719791537bd8de5b881e35355bc86Kaipublic class CarRatedFloatListeners<T> { 32da0eecb6294719791537bd8de5b881e35355bc86Kai private final Map<T, Float> mListenersToRate = new HashMap<>(4); 334d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 344d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik private float mUpdateRate; 354d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 364d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik protected long mLastUpdateTime = -1; 374d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 38da0eecb6294719791537bd8de5b881e35355bc86Kai protected CarRatedFloatListeners(float rate) { 394d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik mUpdateRate = rate; 404d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 414d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 424d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik /** Check listener */ 43da0eecb6294719791537bd8de5b881e35355bc86Kai public boolean contains(T listener) { 444d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return mListenersToRate.containsKey(listener); 454d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 464d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik /** Return current rate after updating */ 474d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik public float getRate() { 484d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return mUpdateRate; 494d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 504d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 514d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik /** 524d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * Remove given listener from the list and update rate if necessary. 534d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * 544d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * @param listener 554d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * @return true if rate was updated. Otherwise, returns false. 564d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik */ 57da0eecb6294719791537bd8de5b881e35355bc86Kai public boolean remove(T listener) { 584d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik mListenersToRate.remove(listener); 594d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik if (mListenersToRate.isEmpty()) { 604d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return false; 614d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 624d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik Float updateRate = Collections.max(mListenersToRate.values()); 634d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik if (updateRate != mUpdateRate) { 644d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik mUpdateRate = updateRate; 654d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return true; 664d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 674d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return false; 684d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 694d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 704d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik public boolean isEmpty() { 714d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return mListenersToRate.isEmpty(); 724d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 734d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 744d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik /** 754d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * Add given listener to the list and update rate if necessary. 764d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * 774d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * @param listener if null, add part is skipped. 784d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * @param updateRate 794d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik * @return true if rate was updated. Otherwise, returns false. 804d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik */ 81da0eecb6294719791537bd8de5b881e35355bc86Kai public boolean addAndUpdateRate(T listener, float updateRate) { 824d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik Float oldUpdateRate = mListenersToRate.put(listener, updateRate); 834d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik if (mUpdateRate < updateRate) { 844d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik mUpdateRate = updateRate; 854d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return true; 864d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } else if (oldUpdateRate != null && oldUpdateRate == mUpdateRate) { 874d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik mUpdateRate = Collections.max(mListenersToRate.values()); 884d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 894d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return false; 904d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 914d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 92da0eecb6294719791537bd8de5b881e35355bc86Kai public Collection<T> getListeners() { 934d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik return mListenersToRate.keySet(); 944d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik } 954d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik} 964d257023389c23b8836f10cda1bfa1ea136f56c9Steve Paik 97