1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.car.hal.test; 18 19 import android.annotation.CheckResult; 20 import android.hardware.automotive.vehicle.VehicleAreaConfig; 21 import android.hardware.automotive.vehicle.VehiclePropConfig; 22 import android.hardware.automotive.vehicle.VehiclePropertyAccess; 23 import android.hardware.automotive.vehicle.VehiclePropertyChangeMode; 24 import android.os.Parcel; 25 26 import java.util.Collection; 27 28 /** 29 * A builder class for {@link android.hardware.automotive.vehicle.VehiclePropConfig} 30 */ 31 public final class AidlVehiclePropConfigBuilder { 32 33 private final VehiclePropConfig mConfig; 34 AidlVehiclePropConfigBuilder(VehiclePropConfig propConfig)35 private AidlVehiclePropConfigBuilder(VehiclePropConfig propConfig) { 36 mConfig = clone(propConfig); 37 } 38 AidlVehiclePropConfigBuilder(int propId)39 private AidlVehiclePropConfigBuilder(int propId) { 40 mConfig = new VehiclePropConfig(); 41 mConfig.prop = propId; 42 mConfig.access = VehiclePropertyAccess.READ_WRITE; 43 mConfig.changeMode = VehiclePropertyChangeMode.ON_CHANGE; 44 mConfig.configArray = new int[0]; 45 mConfig.areaConfigs = new VehicleAreaConfig[0]; 46 } 47 clone(VehiclePropConfig propConfig)48 private VehiclePropConfig clone(VehiclePropConfig propConfig) { 49 VehiclePropConfig newConfig = new VehiclePropConfig(); 50 51 newConfig.prop = propConfig.prop; 52 newConfig.access = propConfig.access; 53 newConfig.changeMode = propConfig.changeMode; 54 newConfig.configString = propConfig.configString; 55 newConfig.minSampleRate = propConfig.minSampleRate; 56 newConfig.maxSampleRate = propConfig.maxSampleRate; 57 newConfig.configArray = propConfig.configArray.clone(); 58 newConfig.areaConfigs = new VehicleAreaConfig[propConfig.areaConfigs.length]; 59 newConfig.areaConfigs = duplicateAreaConfig(propConfig.areaConfigs); 60 return newConfig; 61 } 62 63 /** 64 * Adds an area config. 65 */ 66 @CheckResult addAreaConfig(VehicleAreaConfig config)67 public AidlVehiclePropConfigBuilder addAreaConfig(VehicleAreaConfig config) { 68 int oldLength = mConfig.areaConfigs.length; 69 VehicleAreaConfig[] newConfigs = duplicateAreaConfig(mConfig.areaConfigs, oldLength + 1); 70 newConfigs[oldLength] = config; 71 mConfig.areaConfigs = newConfigs; 72 return this; 73 } 74 75 @CheckResult setAccess(int access)76 public AidlVehiclePropConfigBuilder setAccess(int access) { 77 mConfig.access = access; 78 for (VehicleAreaConfig areaConfig : mConfig.areaConfigs) { 79 areaConfig.access = access; 80 } 81 return this; 82 } 83 84 @CheckResult setAccessPerAreaId(int access, int areaId)85 public AidlVehiclePropConfigBuilder setAccessPerAreaId(int access, int areaId) { 86 for (VehicleAreaConfig areaConfig : mConfig.areaConfigs) { 87 if (areaConfig.areaId == areaId) { 88 areaConfig.access = access; 89 break; 90 } 91 } 92 return this; 93 } 94 95 @CheckResult setChangeMode(int changeMode)96 public AidlVehiclePropConfigBuilder setChangeMode(int changeMode) { 97 mConfig.changeMode = changeMode; 98 return this; 99 } 100 101 @CheckResult setMaxSampleRate(float maxSampleRate)102 public AidlVehiclePropConfigBuilder setMaxSampleRate(float maxSampleRate) { 103 mConfig.maxSampleRate = maxSampleRate; 104 return this; 105 } 106 107 @CheckResult setMinSampleRate(float minSampleRate)108 public AidlVehiclePropConfigBuilder setMinSampleRate(float minSampleRate) { 109 mConfig.minSampleRate = minSampleRate; 110 return this; 111 } 112 113 @CheckResult setConfigString(String configString)114 public AidlVehiclePropConfigBuilder setConfigString(String configString) { 115 mConfig.configString = configString; 116 return this; 117 } 118 119 120 @CheckResult setConfigArray(Collection<Integer> configArray)121 public AidlVehiclePropConfigBuilder setConfigArray(Collection<Integer> configArray) { 122 mConfig.configArray = new int[configArray.size()]; 123 int i = 0; 124 for (int value : configArray) { 125 mConfig.configArray[i] = value; 126 i++; 127 } 128 return this; 129 } 130 131 @CheckResult addAreaConfig(int areaId)132 public AidlVehiclePropConfigBuilder addAreaConfig(int areaId) { 133 VehicleAreaConfig area = new VehicleAreaConfig(); 134 area.areaId = areaId; 135 area.access = mConfig.access; 136 return addAreaConfig(area); 137 } 138 139 @CheckResult addAreaConfig(int areaId, int minValue, int maxValue)140 public AidlVehiclePropConfigBuilder addAreaConfig(int areaId, int minValue, int maxValue) { 141 VehicleAreaConfig area = new VehicleAreaConfig(); 142 area.areaId = areaId; 143 area.access = mConfig.access; 144 area.minInt32Value = minValue; 145 area.maxInt32Value = maxValue; 146 return addAreaConfig(area); 147 } 148 149 @CheckResult addAreaConfig(int areaId, float minValue, float maxValue)150 public AidlVehiclePropConfigBuilder addAreaConfig(int areaId, float minValue, float maxValue) { 151 VehicleAreaConfig area = new VehicleAreaConfig(); 152 area.areaId = areaId; 153 area.access = mConfig.access; 154 area.minFloatValue = minValue; 155 area.maxFloatValue = maxValue; 156 return addAreaConfig(area); 157 } 158 159 @CheckResult addAreaConfig(int areaId, int access)160 public AidlVehiclePropConfigBuilder addAreaConfig(int areaId, int access) { 161 VehicleAreaConfig area = new VehicleAreaConfig(); 162 area.areaId = areaId; 163 area.access = access; 164 return addAreaConfig(area); 165 } 166 167 @CheckResult addAreaConfig(int areaId, int access, int minValue, int maxValue)168 public AidlVehiclePropConfigBuilder addAreaConfig(int areaId, int access, 169 int minValue, int maxValue) { 170 VehicleAreaConfig area = new VehicleAreaConfig(); 171 area.areaId = areaId; 172 area.access = access; 173 area.minInt32Value = minValue; 174 area.maxInt32Value = maxValue; 175 return addAreaConfig(area); 176 } 177 178 @CheckResult addAreaConfig(int areaId, int access, float minValue, float maxValue)179 public AidlVehiclePropConfigBuilder addAreaConfig(int areaId, int access, 180 float minValue, float maxValue) { 181 VehicleAreaConfig area = new VehicleAreaConfig(); 182 area.areaId = areaId; 183 area.access = access; 184 area.minFloatValue = minValue; 185 area.maxFloatValue = maxValue; 186 return addAreaConfig(area); 187 } 188 build()189 public VehiclePropConfig build() { 190 return clone(mConfig); 191 } 192 duplicateAreaConfig(VehicleAreaConfig[] areaConfigs)193 private static VehicleAreaConfig[] duplicateAreaConfig(VehicleAreaConfig[] areaConfigs) { 194 return duplicateAreaConfig(areaConfigs, areaConfigs.length); 195 } 196 duplicateAreaConfig(VehicleAreaConfig[] areaConfigs, int newSize)197 private static VehicleAreaConfig[] duplicateAreaConfig(VehicleAreaConfig[] areaConfigs, 198 int newSize) { 199 VehicleAreaConfig[] out = new VehicleAreaConfig[newSize]; 200 int i = 0; 201 for (VehicleAreaConfig area : areaConfigs) { 202 VehicleAreaConfig newArea = new VehicleAreaConfig(); 203 Parcel parcel = Parcel.obtain(); 204 area.writeToParcel(parcel, /* _aidl_flag= */ 0); 205 parcel.setDataPosition(0); 206 newArea.readFromParcel(parcel); 207 parcel.recycle(); 208 out[i] = newArea; 209 i++; 210 } 211 return out; 212 } 213 214 @CheckResult newBuilder(int propId)215 public static AidlVehiclePropConfigBuilder newBuilder(int propId) { 216 return new AidlVehiclePropConfigBuilder(propId); 217 } 218 219 @CheckResult newBuilder(VehiclePropConfig config)220 public static AidlVehiclePropConfigBuilder newBuilder(VehiclePropConfig config) { 221 return new AidlVehiclePropConfigBuilder(config); 222 } 223 } 224