1f621416f7455b46c88400d994e51f9494f82410eEnrico Granata/*
2f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * Copyright (C) 2017 The Android Open Source Project
3f621416f7455b46c88400d994e51f9494f82410eEnrico Granata *
4f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * Licensed under the Apache License, Version 2.0 (the "License");
5f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * you may not use this file except in compliance with the License.
6f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * You may obtain a copy of the License at
7f621416f7455b46c88400d994e51f9494f82410eEnrico Granata *
8f621416f7455b46c88400d994e51f9494f82410eEnrico Granata *      http://www.apache.org/licenses/LICENSE-2.0
9f621416f7455b46c88400d994e51f9494f82410eEnrico Granata *
10f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * Unless required by applicable law or agreed to in writing, software
11f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * distributed under the License is distributed on an "AS IS" BASIS,
12f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * See the License for the specific language governing permissions and
14f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * limitations under the License.
15f621416f7455b46c88400d994e51f9494f82410eEnrico Granata */
16f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
17f621416f7455b46c88400d994e51f9494f82410eEnrico Granatapackage com.android.car.internal;
18f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
19678064a8f745ac89c2d3a5c48e09d1c10eb35deaPavel Maltsevimport java.util.Collection;
20f621416f7455b46c88400d994e51f9494f82410eEnrico Granataimport java.util.Collections;
21f621416f7455b46c88400d994e51f9494f82410eEnrico Granataimport java.util.HashMap;
22f621416f7455b46c88400d994e51f9494f82410eEnrico Granataimport java.util.Map;
23f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
24f621416f7455b46c88400d994e51f9494f82410eEnrico Granata/**
25f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * Represent listeners for a sensor grouped by their rate.
26f621416f7455b46c88400d994e51f9494f82410eEnrico Granata * @hide
27f621416f7455b46c88400d994e51f9494f82410eEnrico Granata */
28f621416f7455b46c88400d994e51f9494f82410eEnrico Granatapublic class CarRatedListeners<EventListenerType> {
29678064a8f745ac89c2d3a5c48e09d1c10eb35deaPavel Maltsev    private final Map<EventListenerType, Integer> mListenersToRate = new HashMap<>(4);
30678064a8f745ac89c2d3a5c48e09d1c10eb35deaPavel Maltsev
31f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    private int mUpdateRate;
32f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
33f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    protected long mLastUpdateTime = -1;
34f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
35f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    protected CarRatedListeners(int rate) {
36f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        mUpdateRate = rate;
37f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    }
38f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
39f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    public boolean contains(EventListenerType listener) {
40f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        return mListenersToRate.containsKey(listener);
41f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    }
42f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
43f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    public int getRate() {
44f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        return mUpdateRate;
45f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    }
46f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
47f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    /**
48f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     * Remove given listener from the list and update rate if necessary.
49f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     *
50f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     * @param listener
51f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     * @return true if rate was updated. Otherwise, returns false.
52f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     */
53f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    public boolean remove(EventListenerType listener) {
54f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        mListenersToRate.remove(listener);
55f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        if (mListenersToRate.isEmpty()) {
56f621416f7455b46c88400d994e51f9494f82410eEnrico Granata            return false;
57f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        }
58f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        Integer updateRate = Collections.min(mListenersToRate.values());
59f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        if (updateRate != mUpdateRate) {
60f621416f7455b46c88400d994e51f9494f82410eEnrico Granata            mUpdateRate = updateRate;
61f621416f7455b46c88400d994e51f9494f82410eEnrico Granata            return true;
62f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        }
63f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        return false;
64f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    }
65f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
66f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    public boolean isEmpty() {
67f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        return mListenersToRate.isEmpty();
68f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    }
69f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
70f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    /**
71f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     * Add given listener to the list and update rate if necessary.
72f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     *
73f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     * @param listener if null, add part is skipped.
74f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     * @param updateRate
75f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     * @return true if rate was updated. Otherwise, returns false.
76f621416f7455b46c88400d994e51f9494f82410eEnrico Granata     */
77f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    public boolean addAndUpdateRate(EventListenerType listener, int updateRate) {
78f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        Integer oldUpdateRate = mListenersToRate.put(listener, updateRate);
79f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        if (mUpdateRate > updateRate) {
80f621416f7455b46c88400d994e51f9494f82410eEnrico Granata            mUpdateRate = updateRate;
81f621416f7455b46c88400d994e51f9494f82410eEnrico Granata            return true;
82f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        } else if (oldUpdateRate != null && oldUpdateRate == mUpdateRate) {
83f621416f7455b46c88400d994e51f9494f82410eEnrico Granata            mUpdateRate = Collections.min(mListenersToRate.values());
84f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        }
85f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        return false;
86f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    }
87f621416f7455b46c88400d994e51f9494f82410eEnrico Granata
88678064a8f745ac89c2d3a5c48e09d1c10eb35deaPavel Maltsev    public Collection<EventListenerType> getListeners() {
89f621416f7455b46c88400d994e51f9494f82410eEnrico Granata        return mListenersToRate.keySet();
90f621416f7455b46c88400d994e51f9494f82410eEnrico Granata    }
91f621416f7455b46c88400d994e51f9494f82410eEnrico Granata}
92