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