1ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung/* 2ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Copyright (C) 2015 The Android Open Source Project 3ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 4ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Licensed under the Apache License, Version 2.0 (the "License"); 5ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * you may not use this file except in compliance with the License. 6ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * You may obtain a copy of the License at 7ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 8ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * http://www.apache.org/licenses/LICENSE-2.0 9ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 10ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Unless required by applicable law or agreed to in writing, software 11ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * distributed under the License is distributed on an "AS IS" BASIS, 12ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * See the License for the specific language governing permissions and 14ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * limitations under the License. 15ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 16ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 17e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpackage android.car.hardware; 18ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 19ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.Parcel; 20ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.Parcelable; 21ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 22ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 23ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung/** 24ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * A CarSensorEvent object corresponds to a single sensor event coming from the car. The sensor 25ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * data is stored in a sensor-type specific format in the object's float and byte arrays. 26ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 27ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * To aid unmarshalling the object's data arrays, this class provides static nested classes and 28ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * conversion methods, for example {@link EnvironmentData} and {@link #getEnvironmentData}. The 29ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * conversion methods each have an optional data parameter which, if not null, will be used and 30ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * returned. This parameter should be used to avoid unnecessary object churn whenever possible. 31ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Additionally, calling a conversion method on a CarSensorEvent object with an inappropriate type 32ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * will result in an {@code UnsupportedOperationException} being thrown. 33ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 34e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpublic class CarSensorEvent implements Parcelable { 35ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 36ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 37ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Index in {@link #floatValues} for {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL} type of 38ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * sensor. This value is fuel level in percentile. 39ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 40ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int INDEX_FUEL_LEVEL_IN_PERCENTILE = 0; 41ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 42ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Index in {@link #floatValues} for {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL} type of 434afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park * sensor. This value is fuel level in coverable distance. The unit is Km. 44ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 45ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int INDEX_FUEL_LEVEL_IN_DISTANCE = 1; 46ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 474afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park * Index in {@link #intValues} for {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL} type of 484afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park * sensor. This value is set to 1 if fuel low level warning is on. 49ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 50ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int INDEX_FUEL_LOW_WARNING = 0; 51ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 52ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 53cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * GEAR_* represents meaning of intValues[0] for {@link CarSensorManager#SENSOR_TYPE_GEAR} 54ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * sensor type. 55ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * GEAR_NEUTRAL means transmission gear is in neutral state, and the car may be moving. 56ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 57ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_NEUTRAL = 0; 58ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 59ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * intValues[0] from 1 to 99 represents transmission gear number for moving forward. 60ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * GEAR_FIRST is for gear number 1. 61ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 62ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_FIRST = 1; 63ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 2. */ 64ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_SECOND = 2; 65ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 3. */ 66ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_THIRD = 3; 67ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 4. */ 68ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_FOURTH = 4; 69ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 5. */ 70ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_FIFTH = 5; 71ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 6. */ 72ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_SIXTH = 6; 73ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 7. */ 74ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_SEVENTH = 7; 75ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 8. */ 76ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_EIGHTH = 8; 77ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 9. */ 78ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_NINTH = 9; 79ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear number 10. */ 80ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_TENTH = 10; 81ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 82ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * This is for transmission without specific gear number for moving forward like CVT. It tells 83ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * that car is in a transmission state to move it forward. 84ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 85ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_DRIVE = 100; 86ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear in parking state */ 87ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_PARK = 101; 88ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Gear in reverse */ 89ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int GEAR_REVERSE = 102; 90ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 91ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 92ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Bitmask of driving restrictions. 93ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 94ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** No restrictions. */ 95ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int DRIVE_STATUS_UNRESTRICTED = 0; 96ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** No video playback allowed. */ 97ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int DRIVE_STATUS_NO_VIDEO = 0x1; 98ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** No keyboard or rotary controller input allowed. */ 99ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int DRIVE_STATUS_NO_KEYBOARD_INPUT = 0x2; 100ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** No voice input allowed. */ 101ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int DRIVE_STATUS_NO_VOICE_INPUT = 0x4; 102ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** No setup / configuration allowed. */ 103ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int DRIVE_STATUS_NO_CONFIG = 0x8; 104ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Limit displayed message length. */ 105ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int DRIVE_STATUS_LIMIT_MESSAGE_LEN = 0x10; 106ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** represents case where all of the above items are restricted */ 107ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int DRIVE_STATUS_FULLY_RESTRICTED = DRIVE_STATUS_NO_VIDEO | 108ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung DRIVE_STATUS_NO_KEYBOARD_INPUT | DRIVE_STATUS_NO_VOICE_INPUT | DRIVE_STATUS_NO_CONFIG | 109ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung DRIVE_STATUS_LIMIT_MESSAGE_LEN; 110ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 111ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 112ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Index for {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT} in floatValues. 113ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Temperature in Celsius degrees. 114ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 115ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int INDEX_ENVIRONMENT_TEMPERATURE = 0; 116ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 117ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Index for {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT} in floatValues. 118ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Pressure in kPa. 119ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 120ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final int INDEX_ENVIRONMENT_PRESSURE = 1; 121ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 122ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private static final long MILLI_IN_NANOS = 1000000L; 123ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 124ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** Sensor type for this event like {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}. */ 125ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public int sensorType; 126ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 127ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 128ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * When this data was acquired in car or received from car. It is elapsed real-time of data 129ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * reception from car in nanoseconds since system boot. 130ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 131ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 132ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 133ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * array holding float type of sensor data. If the sensor has single value, only floatValues[0] 134ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * should be used. */ 135ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public final float[] floatValues; 136cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung /** array holding int type of sensor data */ 137cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung public final int[] intValues; 138ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 139ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public CarSensorEvent(Parcel in) { 140ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung sensorType = in.readInt(); 141ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung timeStampNs = in.readLong(); 142ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung int len = in.readInt(); 143ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung floatValues = new float[len]; 144ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung in.readFloatArray(floatValues); 145ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung len = in.readInt(); 146cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung intValues = new int[len]; 147cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung in.readIntArray(intValues); 148ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung // version 1 up to here 149ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 150ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 151ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung @Override 152ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public int describeContents() { 153ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return 0; 154ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 155ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 156ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung @Override 157ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public void writeToParcel(Parcel dest, int flags) { 158ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung dest.writeInt(sensorType); 159ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung dest.writeLong(timeStampNs); 160ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung dest.writeInt(floatValues.length); 161ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung dest.writeFloatArray(floatValues); 162cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung dest.writeInt(intValues.length); 163cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung dest.writeIntArray(intValues); 164ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 165ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 166ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static final Parcelable.Creator<CarSensorEvent> CREATOR 167ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung = new Parcelable.Creator<CarSensorEvent>() { 168ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public CarSensorEvent createFromParcel(Parcel in) { 169ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return new CarSensorEvent(in); 170ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 171ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 172ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public CarSensorEvent[] newArray(int size) { 173ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return new CarSensorEvent[size]; 174ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 175ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung }; 176ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 177cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung public CarSensorEvent(int sensorType, long timeStampNs, int floatValueSize, int intValueSize) { 178ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung this.sensorType = sensorType; 179ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung this.timeStampNs = timeStampNs; 180ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung floatValues = new float[floatValueSize]; 181cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung intValues = new int[intValueSize]; 182ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 183ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 184ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** @hide */ 185cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung CarSensorEvent(int sensorType, long timeStampNs, float[] floatValues, int[] intValues) { 186ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung this.sensorType = sensorType; 187ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung this.timeStampNs = timeStampNs; 188ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung this.floatValues = floatValues; 189cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung this.intValues = intValues; 190ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 191ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 192ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung private void checkType(int type) { 193ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (sensorType == type) { 194ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return; 195ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 196ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung throw new UnsupportedOperationException(String.format( 197ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung "Invalid sensor type: expected %d, got %d", type, sensorType)); 198ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 199ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 200ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class EnvironmentData { 201ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 202ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** If unsupported by the car, this value is NaN. */ 203ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public float temperature; 204ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** If unsupported by the car, this value is NaN. */ 205ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public float pressure; 206ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 207ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 208ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 209ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining an {@link EnvironmentData} object from a CarSensorEvent 210ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT}. 211ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 212ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 213ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 214ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return an EnvironmentData object corresponding to the data contained in the CarSensorEvent. 215ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 216ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public EnvironmentData getEnvironmentData(EnvironmentData data) { 217ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_ENVIRONMENT); 218ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 219ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new EnvironmentData(); 220ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 221ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 222ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.temperature = floatValues[INDEX_ENVIRONMENT_TEMPERATURE]; 223ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.pressure = floatValues[INDEX_ENVIRONMENT_PRESSURE]; 224ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 225ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 226ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 227ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class NightData { 228ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 229ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public boolean isNightMode; 230ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 231ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 232ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 233ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining a {@link NightData} object from a CarSensorEvent 234ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_NIGHT}. 235ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 236ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 237ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 238ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return a NightData object corresponding to the data contained in the CarSensorEvent. 239ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 240ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public NightData getNightData(NightData data) { 241ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_NIGHT); 242ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 243ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new NightData(); 244ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 245ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 246cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung data.isNightMode = intValues[0] == 1; 247ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 248ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 249ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 250ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class GearData { 251ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 252ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public int gear; 253ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 254ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 255ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 256ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining a {@link GearData} object from a CarSensorEvent 257ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_GEAR}. 258ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 259ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 260ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 261ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return a GearData object corresponding to the data contained in the CarSensorEvent. 262ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 263ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public GearData getGearData(GearData data) { 264ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_GEAR); 265ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 266ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new GearData(); 267ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 268ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 269cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung data.gear = intValues[0]; 270ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 271ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 272ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 273ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class ParkingBrakeData { 274ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 275ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public boolean isEngaged; 276ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 277ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 278ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 279ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining a {@link ParkingBrakeData} object from a CarSensorEvent 280ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_PARKING_BRAKE}. 281ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 282ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 283ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 284ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return a ParkingBreakData object corresponding to the data contained in the CarSensorEvent. 285ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 286ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public ParkingBrakeData getParkingBrakeData(ParkingBrakeData data) { 287ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_PARKING_BRAKE); 288ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 289ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new ParkingBrakeData(); 290ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 291ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 292cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung data.isEngaged = intValues[0] == 1; 293ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 294ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 295ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 296ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class FuelLevelData { 297ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 2984afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park /** Fuel level in %. If unsupported by the car, this value is -1. */ 299ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public int level; 3004afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park /** Fuel as possible range in Km. If unsupported by the car, this value is -1. */ 3014afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park public float range; 302ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** If unsupported by the car, this value is false. */ 303ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public boolean lowFuelWarning; 304ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 305ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 306ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 307ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining a {@link FuelLevelData} object from a CarSensorEvent 308ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL}. 309ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 310ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 311ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 312ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return a FuelLevel object corresponding to the data contained in the CarSensorEvent. 313ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 314ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public FuelLevelData getFuelLevelData(FuelLevelData data) { 315ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_FUEL_LEVEL); 316ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 317ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new FuelLevelData(); 318ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 319ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 3204afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park if (floatValues == null) { 3214afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park data.level = -1; 3224afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park data.range = -1; 3234afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park } else { 3244afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park if (floatValues[INDEX_FUEL_LEVEL_IN_PERCENTILE] < 0) { 3254afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park data.level = -1; 3264afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park } else { 3274afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park data.level = (int) floatValues[INDEX_FUEL_LEVEL_IN_PERCENTILE]; 3284afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park } 3294afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park if (floatValues[INDEX_FUEL_LEVEL_IN_DISTANCE] < 0) { 3304afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park data.range = -1; 3314afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park } else { 3324afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park data.range = floatValues[INDEX_FUEL_LEVEL_IN_DISTANCE]; 3334afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park } 3344afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park } 335cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung data.lowFuelWarning = intValues[0] == 1; 336ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 337ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 338ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 339ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class OdometerData { 340ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 341ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public float kms; 342ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 343ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 344ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 345ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining an {@link OdometerData} object from a CarSensorEvent 346ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_ODOMETER}. 347ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 348ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 349ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 350ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return an OdometerData object corresponding to the data contained in the CarSensorEvent. 351ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 352ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public OdometerData getOdometerData(OdometerData data) { 353ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_ODOMETER); 354ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 355ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new OdometerData(); 356ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 357ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 358ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.kms = floatValues[0]; 359ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 360ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 361ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 362ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class RpmData { 363ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 364ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public float rpm; 365ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 366ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 367ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 368ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining a {@link RpmData} object from a CarSensorEvent 369ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_RPM}. 370ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 371ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 372ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 373ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return a RpmData object corresponding to the data contained in the CarSensorEvent. 374ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 375ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public RpmData getRpmData(RpmData data) { 376ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_RPM); 377ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 378ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new RpmData(); 379ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 380ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 381ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.rpm = floatValues[0]; 382ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 383ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 384ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 385ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class CarSpeedData { 386ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 387ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public float carSpeed; 388ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 389ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 390ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 391ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining a {@link CarSpeedData} object from a CarSensorEvent 392ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}. 393ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 394ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 395ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 396ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return a CarSpeedData object corresponding to the data contained in the CarSensorEvent. 397ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 398ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public CarSpeedData getCarSpeedData(CarSpeedData data) { 399ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_CAR_SPEED); 400ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 401ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new CarSpeedData(); 402ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 403ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.timeStampNs = timeStampNs; 404ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data.carSpeed = floatValues[0]; 405ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 406ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 407ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 408ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public static class DrivingStatusData { 409ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public long timeStampNs; 410cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung public int status; 411ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 412ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 413ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** 414ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Convenience method for obtaining a {@link DrivingStatusData} object from a CarSensorEvent 415ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * object with type {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}. 416ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * 417ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @param data an optional output parameter which, if non-null, will be used by this method 418ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * instead of a newly created object. 419ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * @return a DrivingStatusData object corresponding to the data contained in the CarSensorEvent. 420ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */ 421ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public DrivingStatusData getDrivingStatusData(DrivingStatusData data) { 422ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung checkType(CarSensorManager.SENSOR_TYPE_DRIVING_STATUS); 423ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (data == null) { 424ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung data = new DrivingStatusData(); 425ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 426cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung data.status = intValues[0]; 427ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return data; 428ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 429ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung 430ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung /** @hide */ 431ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung @Override 432ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung public String toString() { 433ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung StringBuilder sb = new StringBuilder(); 434ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung sb.append(getClass().getName() + "["); 435ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung sb.append("type:" + Integer.toHexString(sensorType)); 436ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung if (floatValues != null && floatValues.length > 0) { 437ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung sb.append(" float values:"); 438ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung for (float v: floatValues) { 439ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung sb.append(" " + v); 440ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 441ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 442cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung if (intValues != null && intValues.length > 0) { 443cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung sb.append(" int values:"); 444cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung for (int v: intValues) { 445ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung sb.append(" " + v); 446ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 447ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 448ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung sb.append("]"); 449ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung return sb.toString(); 450ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung } 451ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung} 452