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