1fb5f6232486612413b129a2100bac720589dee0dSteve Paik/*
2fb5f6232486612413b129a2100bac720589dee0dSteve Paik * Copyright (C) 2016 The Android Open Source Project
3fb5f6232486612413b129a2100bac720589dee0dSteve Paik *
4fb5f6232486612413b129a2100bac720589dee0dSteve Paik * Licensed under the Apache License, Version 2.0 (the "License");
5fb5f6232486612413b129a2100bac720589dee0dSteve Paik * you may not use this file except in compliance with the License.
6fb5f6232486612413b129a2100bac720589dee0dSteve Paik * You may obtain a copy of the License at
7fb5f6232486612413b129a2100bac720589dee0dSteve Paik *
8fb5f6232486612413b129a2100bac720589dee0dSteve Paik *      http://www.apache.org/licenses/LICENSE-2.0
9fb5f6232486612413b129a2100bac720589dee0dSteve Paik *
10fb5f6232486612413b129a2100bac720589dee0dSteve Paik * Unless required by applicable law or agreed to in writing, software
11fb5f6232486612413b129a2100bac720589dee0dSteve Paik * distributed under the License is distributed on an "AS IS" BASIS,
12fb5f6232486612413b129a2100bac720589dee0dSteve Paik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fb5f6232486612413b129a2100bac720589dee0dSteve Paik * See the License for the specific language governing permissions and
14fb5f6232486612413b129a2100bac720589dee0dSteve Paik * limitations under the License.
15fb5f6232486612413b129a2100bac720589dee0dSteve Paik */
16fb5f6232486612413b129a2100bac720589dee0dSteve Paik
17fb5f6232486612413b129a2100bac720589dee0dSteve Paikpackage android.car.hardware;
18fb5f6232486612413b129a2100bac720589dee0dSteve Paik
19fb5f6232486612413b129a2100bac720589dee0dSteve Paikimport android.annotation.Nullable;
20fb5f6232486612413b129a2100bac720589dee0dSteve Paikimport android.annotation.SystemApi;
215f537ee9564869b5c281abcf885553de6d42a148Vitalii Tomkivimport android.car.VehicleAreaType;
22fb5f6232486612413b129a2100bac720589dee0dSteve Paikimport android.os.Parcel;
23fb5f6232486612413b129a2100bac720589dee0dSteve Paikimport android.os.Parcelable;
24fb5f6232486612413b129a2100bac720589dee0dSteve Paikimport android.util.SparseArray;
25fb5f6232486612413b129a2100bac720589dee0dSteve Paik
26fb5f6232486612413b129a2100bac720589dee0dSteve Paikimport java.lang.reflect.Array;
275bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paikimport java.util.ArrayList;
285bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paikimport java.util.Collections;
295bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paikimport java.util.List;
30fb5f6232486612413b129a2100bac720589dee0dSteve Paik
31fb5f6232486612413b129a2100bac720589dee0dSteve Paik/**
32fb5f6232486612413b129a2100bac720589dee0dSteve Paik * Represents general information about car property such as data type and min/max ranges for car
33fb5f6232486612413b129a2100bac720589dee0dSteve Paik * areas (if applicable). This class supposed to be immutable, parcelable and could be passed over.
34fb5f6232486612413b129a2100bac720589dee0dSteve Paik *
35fb5f6232486612413b129a2100bac720589dee0dSteve Paik * <p>Use {@link CarPropertyConfig#newBuilder} to create an instance of this class.
36fb5f6232486612413b129a2100bac720589dee0dSteve Paik *
37fb5f6232486612413b129a2100bac720589dee0dSteve Paik * @param <T> refer to Parcel#writeValue(Object) to get a list of all supported types. The class
38fb5f6232486612413b129a2100bac720589dee0dSteve Paik * should be visible to framework as default class loader is being used here.
39fb5f6232486612413b129a2100bac720589dee0dSteve Paik *
40fb5f6232486612413b129a2100bac720589dee0dSteve Paik * @hide
41fb5f6232486612413b129a2100bac720589dee0dSteve Paik */
42fb5f6232486612413b129a2100bac720589dee0dSteve Paik@SystemApi
43fb5f6232486612413b129a2100bac720589dee0dSteve Paikpublic class CarPropertyConfig<T> implements Parcelable {
445bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final int mAccess;
45fb5f6232486612413b129a2100bac720589dee0dSteve Paik    private final int mAreaType;
465bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final int mChangeMode;
475bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final ArrayList<Integer> mConfigArray;
485bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final String mConfigString;
495bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final float mMaxSampleRate;
505bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final float mMinSampleRate;
515bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final int mPropertyId;
52fb5f6232486612413b129a2100bac720589dee0dSteve Paik    private final SparseArray<AreaConfig<T>> mSupportedAreas;
535bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private final Class<T> mType;
54fb5f6232486612413b129a2100bac720589dee0dSteve Paik
555bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    private CarPropertyConfig(int access, int areaType, int changeMode,
56463d51ef00010d8735360ec78adcdf29f386d451Steve Paik            ArrayList<Integer> configArray, String configString,
575bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            float maxSampleRate, float minSampleRate, int propertyId,
585bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            SparseArray<AreaConfig<T>> supportedAreas, Class<T> type) {
595bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mAccess = access;
60fb5f6232486612413b129a2100bac720589dee0dSteve Paik        mAreaType = areaType;
615bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mChangeMode = changeMode;
625bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mConfigArray = configArray;
635bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mConfigString = configString;
645bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mMaxSampleRate = maxSampleRate;
655bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mMinSampleRate = minSampleRate;
665bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mPropertyId = propertyId;
67fb5f6232486612413b129a2100bac720589dee0dSteve Paik        mSupportedAreas = supportedAreas;
685bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mType = type;
69fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
70fb5f6232486612413b129a2100bac720589dee0dSteve Paik
715bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public int getAccess() {
725bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mAccess;
735bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
745bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public @VehicleAreaType.VehicleAreaTypeValue int getAreaType() {
755bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mAreaType;
765bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
775bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public int getChangeMode() {
785bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mChangeMode;
795bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
805bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public List<Integer> getConfigArray() {
815bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return Collections.unmodifiableList(mConfigArray);
825bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
835bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public String getConfigString() {
845bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mConfigString;
855bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
865bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public float getMaxSampleRate() {
875bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mMaxSampleRate;
885bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
895bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public float getMinSampleRate() {
905bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mMinSampleRate;
915bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
925bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public int getPropertyId() {
935bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mPropertyId;
945bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
955bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public Class<T> getPropertyType() {
965bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return mType;
975bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    }
98fb5f6232486612413b129a2100bac720589dee0dSteve Paik
99fb5f6232486612413b129a2100bac720589dee0dSteve Paik    /** Returns true if this property doesn't hold car area-specific configuration */
100fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public boolean isGlobalProperty() {
101419f5efd172a72f87e674287ef12292e18067b6cSteve Paik        return mAreaType == VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
102fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
103fb5f6232486612413b129a2100bac720589dee0dSteve Paik
104fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public int getAreaCount() {
105fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return mSupportedAreas.size();
106fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
107fb5f6232486612413b129a2100bac720589dee0dSteve Paik
108fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public int[] getAreaIds() {
109fb5f6232486612413b129a2100bac720589dee0dSteve Paik        int[] areaIds = new int[mSupportedAreas.size()];
110fb5f6232486612413b129a2100bac720589dee0dSteve Paik        for (int i = 0; i < areaIds.length; i++) {
111fb5f6232486612413b129a2100bac720589dee0dSteve Paik            areaIds[i] = mSupportedAreas.keyAt(i);
112fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
113fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return areaIds;
114fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
115fb5f6232486612413b129a2100bac720589dee0dSteve Paik
116fb5f6232486612413b129a2100bac720589dee0dSteve Paik    /**
117fb5f6232486612413b129a2100bac720589dee0dSteve Paik     * Returns the first areaId.
118fb5f6232486612413b129a2100bac720589dee0dSteve Paik     * Throws {@link IllegalStateException} if supported area count not equals to one.
119fb5f6232486612413b129a2100bac720589dee0dSteve Paik     * */
120fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public int getFirstAndOnlyAreaId() {
121fb5f6232486612413b129a2100bac720589dee0dSteve Paik        if (mSupportedAreas.size() != 1) {
122fb5f6232486612413b129a2100bac720589dee0dSteve Paik            throw new IllegalStateException("Expected one and only area in this property. Prop: 0x"
123fb5f6232486612413b129a2100bac720589dee0dSteve Paik                    + Integer.toHexString(mPropertyId));
124fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
125fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return mSupportedAreas.keyAt(0);
126fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
127fb5f6232486612413b129a2100bac720589dee0dSteve Paik
128fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public boolean hasArea(int areaId) {
129bb051044c22d7b3f99958cc32384e2bb015f68adVitalii Tomkiv        return mSupportedAreas.indexOfKey(areaId) >= 0;
130fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
131fb5f6232486612413b129a2100bac720589dee0dSteve Paik
132fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @Nullable
133fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public T getMinValue(int areaId) {
134fb5f6232486612413b129a2100bac720589dee0dSteve Paik        AreaConfig<T> area = mSupportedAreas.get(areaId);
135fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return area == null ? null : area.getMinValue();
136fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
137fb5f6232486612413b129a2100bac720589dee0dSteve Paik
138fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @Nullable
139fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public T getMaxValue(int areaId) {
140fb5f6232486612413b129a2100bac720589dee0dSteve Paik        AreaConfig<T> area = mSupportedAreas.get(areaId);
141fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return area == null ? null : area.getMaxValue();
142fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
143fb5f6232486612413b129a2100bac720589dee0dSteve Paik
144fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @Nullable
145fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public T getMinValue() {
146fb5f6232486612413b129a2100bac720589dee0dSteve Paik        AreaConfig<T> area = mSupportedAreas.valueAt(0);
147fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return area == null ? null : area.getMinValue();
148fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
149fb5f6232486612413b129a2100bac720589dee0dSteve Paik
150fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @Nullable
151fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public T getMaxValue() {
152fb5f6232486612413b129a2100bac720589dee0dSteve Paik        AreaConfig<T> area = mSupportedAreas.valueAt(0);
153fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return area == null ? null : area.getMaxValue();
154fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
155fb5f6232486612413b129a2100bac720589dee0dSteve Paik
156fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @Override
157fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public int describeContents() {
158fb5f6232486612413b129a2100bac720589dee0dSteve Paik        return 0;
159fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
160fb5f6232486612413b129a2100bac720589dee0dSteve Paik
161fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @Override
162fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public void writeToParcel(Parcel dest, int flags) {
1635bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeInt(mAccess);
164fb5f6232486612413b129a2100bac720589dee0dSteve Paik        dest.writeInt(mAreaType);
1655bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeInt(mChangeMode);
1665bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeInt(mConfigArray.size());
1675bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        for (int i = 0; i < mConfigArray.size(); i++) {
1685bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            dest.writeInt(mConfigArray.get(i));
1695bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
1705bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeString(mConfigString);
1715bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeFloat(mMaxSampleRate);
1725bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeFloat(mMinSampleRate);
1735bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeInt(mPropertyId);
174fb5f6232486612413b129a2100bac720589dee0dSteve Paik        dest.writeInt(mSupportedAreas.size());
175fb5f6232486612413b129a2100bac720589dee0dSteve Paik        for (int i = 0; i < mSupportedAreas.size(); i++) {
176fb5f6232486612413b129a2100bac720589dee0dSteve Paik            dest.writeInt(mSupportedAreas.keyAt(i));
177fb5f6232486612413b129a2100bac720589dee0dSteve Paik            dest.writeParcelable(mSupportedAreas.valueAt(i), flags);
178fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
1795bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        dest.writeString(mType.getName());
180fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
181fb5f6232486612413b129a2100bac720589dee0dSteve Paik
182fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @SuppressWarnings("unchecked")
183fb5f6232486612413b129a2100bac720589dee0dSteve Paik    private CarPropertyConfig(Parcel in) {
1845bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mAccess = in.readInt();
185fb5f6232486612413b129a2100bac720589dee0dSteve Paik        mAreaType = in.readInt();
1865bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mChangeMode = in.readInt();
1875bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        int configArraySize = in.readInt();
1885bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mConfigArray = new ArrayList<Integer>(configArraySize);
1895bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        for (int i = 0; i < configArraySize; i++) {
1905bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mConfigArray.add(in.readInt());
1915bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
1925bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mConfigString = in.readString();
1935bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mMaxSampleRate = in.readFloat();
1945bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mMinSampleRate = in.readFloat();
1955bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        mPropertyId = in.readInt();
196fb5f6232486612413b129a2100bac720589dee0dSteve Paik        int areaSize = in.readInt();
197fb5f6232486612413b129a2100bac720589dee0dSteve Paik        mSupportedAreas = new SparseArray<>(areaSize);
198fb5f6232486612413b129a2100bac720589dee0dSteve Paik        for (int i = 0; i < areaSize; i++) {
199fb5f6232486612413b129a2100bac720589dee0dSteve Paik            int areaId = in.readInt();
200fb5f6232486612413b129a2100bac720589dee0dSteve Paik            AreaConfig<T> area = in.readParcelable(getClass().getClassLoader());
201fb5f6232486612413b129a2100bac720589dee0dSteve Paik            mSupportedAreas.put(areaId, area);
202fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
2035bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        String className = in.readString();
2045bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        try {
2055bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mType = (Class<T>) Class.forName(className);
2065bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        } catch (ClassNotFoundException e) {
2075bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            throw new IllegalArgumentException("Class not found: " + className);
2085bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
209fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
210fb5f6232486612413b129a2100bac720589dee0dSteve Paik
211fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public static final Creator<CarPropertyConfig> CREATOR = new Creator<CarPropertyConfig>() {
212fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Override
213fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public CarPropertyConfig createFromParcel(Parcel in) {
214fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return new CarPropertyConfig(in);
215fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
216fb5f6232486612413b129a2100bac720589dee0dSteve Paik
217fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Override
218fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public CarPropertyConfig[] newArray(int size) {
219fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return new CarPropertyConfig[size];
220fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
221fb5f6232486612413b129a2100bac720589dee0dSteve Paik    };
222fb5f6232486612413b129a2100bac720589dee0dSteve Paik
223fb5f6232486612413b129a2100bac720589dee0dSteve Paik    @Override
224fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public String toString() {
2255bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return "CarPropertyConfig{"
2265bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + "mPropertyId=" + mPropertyId
2275bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mAccess=" + mAccess
2285bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mAreaType=" + mAreaType
2295bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mChangeMode=" + mChangeMode
2305bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mConfigArray=" + mConfigArray
2315bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mConfigString=" + mConfigString
2325bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mMaxSampleRate=" + mMaxSampleRate
2335bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mMinSampleRate=" + mMinSampleRate
2345bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mSupportedAreas=" + mSupportedAreas
2355bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + ", mType=" + mType
2365bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                + '}';
237fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
238fb5f6232486612413b129a2100bac720589dee0dSteve Paik
239fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public static class AreaConfig<T> implements Parcelable {
240fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Nullable private final T mMinValue;
241fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Nullable private final T mMaxValue;
242fb5f6232486612413b129a2100bac720589dee0dSteve Paik
243fb5f6232486612413b129a2100bac720589dee0dSteve Paik        private AreaConfig(T minValue, T maxValue) {
244fb5f6232486612413b129a2100bac720589dee0dSteve Paik            mMinValue = minValue;
245fb5f6232486612413b129a2100bac720589dee0dSteve Paik            mMaxValue = maxValue;
246fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
247fb5f6232486612413b129a2100bac720589dee0dSteve Paik
248fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public static final Parcelable.Creator<AreaConfig<Object>> CREATOR
249fb5f6232486612413b129a2100bac720589dee0dSteve Paik                = getCreator(Object.class);
250fb5f6232486612413b129a2100bac720589dee0dSteve Paik
251fb5f6232486612413b129a2100bac720589dee0dSteve Paik        private static <E> Parcelable.Creator<AreaConfig<E>> getCreator(final Class<E> clazz) {
252fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return new Creator<AreaConfig<E>>() {
253fb5f6232486612413b129a2100bac720589dee0dSteve Paik                @Override
254fb5f6232486612413b129a2100bac720589dee0dSteve Paik                public AreaConfig<E> createFromParcel(Parcel source) {
255fb5f6232486612413b129a2100bac720589dee0dSteve Paik                    return new AreaConfig<>(source);
256fb5f6232486612413b129a2100bac720589dee0dSteve Paik                }
257fb5f6232486612413b129a2100bac720589dee0dSteve Paik
258fb5f6232486612413b129a2100bac720589dee0dSteve Paik                @Override @SuppressWarnings("unchecked")
259fb5f6232486612413b129a2100bac720589dee0dSteve Paik                public AreaConfig<E>[] newArray(int size) {
260fb5f6232486612413b129a2100bac720589dee0dSteve Paik                    return (AreaConfig<E>[]) Array.newInstance(clazz, size);
261fb5f6232486612413b129a2100bac720589dee0dSteve Paik                }
262fb5f6232486612413b129a2100bac720589dee0dSteve Paik            };
263fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
264fb5f6232486612413b129a2100bac720589dee0dSteve Paik
265fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @SuppressWarnings("unchecked")
266fb5f6232486612413b129a2100bac720589dee0dSteve Paik        private AreaConfig(Parcel in) {
267fb5f6232486612413b129a2100bac720589dee0dSteve Paik            mMinValue = (T) in.readValue(getClass().getClassLoader());
268fb5f6232486612413b129a2100bac720589dee0dSteve Paik            mMaxValue = (T) in.readValue(getClass().getClassLoader());
269fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
270fb5f6232486612413b129a2100bac720589dee0dSteve Paik
271fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Nullable public T getMinValue() { return mMinValue; }
272fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Nullable public T getMaxValue() { return mMaxValue; }
273fb5f6232486612413b129a2100bac720589dee0dSteve Paik
274fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Override
275fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public int describeContents() {
276fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return 0;
277fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
278fb5f6232486612413b129a2100bac720589dee0dSteve Paik
279fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Override
280fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public void writeToParcel(Parcel dest, int flags) {
281fb5f6232486612413b129a2100bac720589dee0dSteve Paik            dest.writeValue(mMinValue);
282fb5f6232486612413b129a2100bac720589dee0dSteve Paik            dest.writeValue(mMaxValue);
283fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
284fb5f6232486612413b129a2100bac720589dee0dSteve Paik
285fb5f6232486612413b129a2100bac720589dee0dSteve Paik        @Override
286fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public String toString() {
287fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return "CarAreaConfig{" +
288fb5f6232486612413b129a2100bac720589dee0dSteve Paik                    "mMinValue=" + mMinValue +
289fb5f6232486612413b129a2100bac720589dee0dSteve Paik                    ", mMaxValue=" + mMaxValue +
290fb5f6232486612413b129a2100bac720589dee0dSteve Paik                    '}';
291fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
292fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
293fb5f6232486612413b129a2100bac720589dee0dSteve Paik
2945bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    /**
2955bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     * Prepare an instance of CarPropertyConfig
2965bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     *
2975bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     * @return Builder<T>
2985bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     */
2995bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public static <T> Builder<T> newBuilder(Class<T> type, int propertyId, int areaType,
3005bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                                            int areaCapacity) {
3015bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return new Builder<>(areaCapacity, areaType, propertyId, type);
302fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
303fb5f6232486612413b129a2100bac720589dee0dSteve Paik
304fb5f6232486612413b129a2100bac720589dee0dSteve Paik
3055bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    /**
3065bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     * Prepare an instance of CarPropertyConfig
3075bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     *
3085bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     * @return Builder<T>
3095bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik     */
3105bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik    public static <T> Builder<T> newBuilder(Class<T> type, int propertyId, int areaType) {
3115bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        return new Builder<>(0, areaType, propertyId, type);
312fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
313fb5f6232486612413b129a2100bac720589dee0dSteve Paik
314fb5f6232486612413b129a2100bac720589dee0dSteve Paik    public static class Builder<T> {
3155bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private int mAccess;
316fb5f6232486612413b129a2100bac720589dee0dSteve Paik        private final int mAreaType;
3175bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private int mChangeMode;
3185bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private final ArrayList<Integer> mConfigArray;
3195bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private String mConfigString;
3205bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private float mMaxSampleRate;
3215bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private float mMinSampleRate;
3225bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private final int mPropertyId;
3235bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private final SparseArray<AreaConfig<T>> mSupportedAreas;
3245bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private final Class<T> mType;
325fb5f6232486612413b129a2100bac720589dee0dSteve Paik
3265bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        private Builder(int areaCapacity, int areaType, int propertyId, Class<T> type) {
327fb5f6232486612413b129a2100bac720589dee0dSteve Paik            mAreaType = areaType;
3285bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mConfigArray = new ArrayList<>();
3295bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mPropertyId = propertyId;
330fb5f6232486612413b129a2100bac720589dee0dSteve Paik            if (areaCapacity != 0) {
3315bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                mSupportedAreas = new SparseArray<>(areaCapacity);
332fb5f6232486612413b129a2100bac720589dee0dSteve Paik            } else {
3335bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                mSupportedAreas = new SparseArray<>();
334fb5f6232486612413b129a2100bac720589dee0dSteve Paik            }
3355bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mType = type;
336fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
337fb5f6232486612413b129a2100bac720589dee0dSteve Paik
3385bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
3395bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Add supported areas parameter to CarPropertyConfig
3405bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
3415bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
3425bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
343fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public Builder<T> addAreas(int[] areaIds) {
344fb5f6232486612413b129a2100bac720589dee0dSteve Paik            for (int id : areaIds) {
3455bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                mSupportedAreas.put(id, null);
346fb5f6232486612413b129a2100bac720589dee0dSteve Paik            }
347fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return this;
348fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
349fb5f6232486612413b129a2100bac720589dee0dSteve Paik
3505bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
3515bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Add area to CarPropertyConfig
3525bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
3535bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
3545bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
355fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public Builder<T> addArea(int areaId) {
356fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return addAreaConfig(areaId, null, null);
357fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
358fb5f6232486612413b129a2100bac720589dee0dSteve Paik
3595bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
3605bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Add areaConfig to CarPropertyConfig
3615bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
3625bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
3635bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
364fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public Builder<T> addAreaConfig(int areaId, T min, T max) {
365fb5f6232486612413b129a2100bac720589dee0dSteve Paik            if (min == null && max == null) {
3665bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                mSupportedAreas.put(areaId, null);
367fb5f6232486612413b129a2100bac720589dee0dSteve Paik            } else {
3685bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik                mSupportedAreas.put(areaId, new AreaConfig<>(min, max));
369fb5f6232486612413b129a2100bac720589dee0dSteve Paik            }
370fb5f6232486612413b129a2100bac720589dee0dSteve Paik            return this;
371fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
372fb5f6232486612413b129a2100bac720589dee0dSteve Paik
3735bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
3745bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Set access parameter to CarPropertyConfig
3755bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
3765bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
3775bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
3785bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        public Builder<T> setAccess(int access) {
3795bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mAccess = access;
3805bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            return this;
3815bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
3825bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik
3835bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
3845bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Set changeMode parameter to CarPropertyConfig
3855bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
3865bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
3875bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
3885bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        public Builder<T> setChangeMode(int changeMode) {
3895bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mChangeMode = changeMode;
3905bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            return this;
3915bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
3925bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik
3935bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
3945bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Set configArray parameter to CarPropertyConfig
3955bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
3965bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
3975bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
3985bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        public Builder<T> setConfigArray(ArrayList<Integer> configArray) {
3995bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mConfigArray.clear();
4005bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mConfigArray.addAll(configArray);
4015bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            return this;
4025bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
4035bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik
4045bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
4055bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Set configString parameter to CarPropertyConfig
4065bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
4075bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
4085bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
4095bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        public Builder<T> setConfigString(String configString) {
4105bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mConfigString = configString;
4115bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            return this;
4125bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
4135bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik
4145bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
4155bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Set maxSampleRate parameter to CarPropertyConfig
4165bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
4175bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
4185bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
4195bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        public Builder<T> setMaxSampleRate(float maxSampleRate) {
4205bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mMaxSampleRate = maxSampleRate;
4215bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            return this;
4225bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
4235bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik
4245bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        /**
4255bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * Set minSampleRate parameter to CarPropertyConfig
4265bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         *
4275bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         * @return Builder<T>
4285bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik         */
4295bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        public Builder<T> setMinSampleRate(float minSampleRate) {
4305bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            mMinSampleRate = minSampleRate;
4315bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            return this;
4325bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik        }
4335bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik
434fb5f6232486612413b129a2100bac720589dee0dSteve Paik        public CarPropertyConfig<T> build() {
4355bb392c6fae473dbc16d960d773483283dbc0f6dSteve Paik            return new CarPropertyConfig<>(mAccess, mAreaType, mChangeMode, mConfigArray,
436463d51ef00010d8735360ec78adcdf29f386d451Steve Paik                                           mConfigString, mMaxSampleRate, mMinSampleRate,
437463d51ef00010d8735360ec78adcdf29f386d451Steve Paik                                           mPropertyId, mSupportedAreas, mType);
438fb5f6232486612413b129a2100bac720589dee0dSteve Paik        }
439fb5f6232486612413b129a2100bac720589dee0dSteve Paik    }
440fb5f6232486612413b129a2100bac720589dee0dSteve Paik}
441