1 /* 2 * Copyright (C) 2015 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 android.car; 18 19 import android.annotation.Nullable; 20 import android.car.annotation.FutureFeature; 21 import android.car.annotation.ValueTypeDef; 22 import android.os.Bundle; 23 import android.os.IBinder; 24 import android.os.RemoteException; 25 26 27 import com.android.internal.annotations.GuardedBy; 28 29 import java.lang.annotation.Retention; 30 import java.lang.annotation.RetentionPolicy; 31 32 33 /** 34 * Utility to retrieve various static information from car. Each data are grouped as {@link Bundle} 35 * and relevant data can be checked from {@link Bundle} using pre-specified keys. 36 */ 37 public final class CarInfoManager implements CarManagerBase { 38 39 /** 40 * Key for manufacturer of the car. Passed in basic info Bundle. 41 * @hide 42 */ 43 @ValueTypeDef(type = String.class) 44 public static final String BASIC_INFO_KEY_MANUFACTURER = "android.car.manufacturer"; 45 /** 46 * Key for model name of the car. This information may not necessarily allow distinguishing 47 * different car models as the same name may be used for different cars depending on 48 * manufacturers. Passed in basic info Bundle. 49 * @hide 50 */ 51 @ValueTypeDef(type = String.class) 52 public static final String BASIC_INFO_KEY_MODEL = "android.car.model"; 53 /** 54 * Key for model year of the car in AC. Passed in basic info Bundle. 55 * @hide 56 */ 57 @ValueTypeDef(type = Integer.class) 58 public static final String BASIC_INFO_KEY_MODEL_YEAR = "android.car.model-year"; 59 /** 60 * Key for unique identifier for the car. This is not VIN, and id is persistent until user 61 * resets it. Passed in basic info Bundle. 62 * @hide 63 */ 64 @ValueTypeDef(type = String.class) 65 public static final String BASIC_INFO_KEY_VEHICLE_ID = "android.car.vehicle-id"; 66 67 /** 68 * Key for product configuration info. 69 * @FutureFeature Cannot drop due to usage in non-flag protected place. 70 * @hide 71 */ 72 @ValueTypeDef(type = String.class) 73 public static final String INFO_KEY_PRODUCT_CONFIGURATION = "android.car.product-config"; 74 75 /* TODO bug: 32059999 76 //@ValueTypeDef(type = Integer.class) 77 //public static final String KEY_DRIVER_POSITION = "driver-position"; 78 79 //@ValueTypeDef(type = int[].class) 80 //public static final String KEY_SEAT_CONFIGURATION = "seat-configuration"; 81 82 //@ValueTypeDef(type = Integer.class) 83 //public static final String KEY_WINDOW_CONFIGURATION = "window-configuration"; 84 85 //MT, AT, CVT, ... 86 //@ValueTypeDef(type = Integer.class) 87 //public static final String KEY_TRANSMISSION_TYPE = "transmission-type"; 88 89 // add: transmission gear available selection, gear available steps 90 // drive wheel: FWD, RWD, AWD, 4WD */ 91 92 private final ICarInfo mService; 93 94 @GuardedBy("this") 95 private Bundle mBasicInfo; 96 97 /** 98 * Return manufacturer of the car. 99 * @return null if information is not available. 100 */ getManufacturer()101 public @android.annotation.Nullable String getManufacturer() throws CarNotConnectedException { 102 return getBasicInfo().getString(BASIC_INFO_KEY_MANUFACTURER); 103 } 104 105 /** 106 * Return model name of the car. This information may not necessarily allow distinguishing 107 * different car models as the same name may be used for different cars depending on 108 * manufacturers. 109 * @return null if information is not available. 110 */ getModel()111 public @Nullable String getModel() throws CarNotConnectedException { 112 return getBasicInfo().getString(BASIC_INFO_KEY_MODEL); 113 } 114 115 /** 116 * Return model year of the car in AC. 117 * @return null if information is not available. 118 */ getModelYear()119 public @Nullable String getModelYear() throws CarNotConnectedException { 120 return getBasicInfo().getString(BASIC_INFO_KEY_MODEL_YEAR); 121 } 122 123 /** 124 * Return unique identifier for the car. This is not VIN, and id is persistent until user 125 * resets it. This ID is guaranteed to be always available. 126 * @return vehicle id 127 */ getVehicleId()128 public String getVehicleId() throws CarNotConnectedException { 129 return getBasicInfo().getString(BASIC_INFO_KEY_VEHICLE_ID); 130 } 131 132 /** 133 * Get product configuration string. Contents of this string is product specific but it should 134 * be composed of key-value pairs with the format of: 135 * key1=value1;key2=value2;... 136 * @return null if such information is not available in this car. 137 * @throws CarNotConnectedException 138 * @hide 139 */ 140 @FutureFeature getProductConfiguration()141 public @Nullable String getProductConfiguration() throws CarNotConnectedException { 142 try { 143 return mService.getStringInfo(INFO_KEY_PRODUCT_CONFIGURATION); 144 } catch (IllegalStateException e) { 145 CarApiUtil.checkCarNotConnectedExceptionFromCarService(e); 146 } catch (RemoteException e) { 147 throw new CarNotConnectedException(e); 148 } 149 return null; 150 } 151 152 /** 153 * Get {@link android.os.Bundle} containing basic car information. Check 154 * {@link #BASIC_INFO_KEY_MANUFACTURER}, {@link #BASIC_INFO_KEY_MODEL}, 155 * {@link #BASIC_INFO_KEY_MODEL_YEAR}, and {@link #BASIC_INFO_KEY_VEHICLE_ID} for supported 156 * keys in the {@link android.os.Bundle}. 157 * @return {@link android.os.Bundle} containing basic car info. 158 * @throws CarNotConnectedException 159 */ getBasicInfo()160 private synchronized Bundle getBasicInfo() throws CarNotConnectedException { 161 if (mBasicInfo != null) { 162 return mBasicInfo; 163 } 164 try { 165 mBasicInfo = mService.getBasicInfo(); 166 } catch (IllegalStateException e) { 167 CarApiUtil.checkCarNotConnectedExceptionFromCarService(e); 168 } catch (RemoteException e) { 169 throw new CarNotConnectedException(e); 170 } 171 return mBasicInfo; 172 } 173 174 /** @hide */ CarInfoManager(IBinder service)175 CarInfoManager(IBinder service) { 176 mService = ICarInfo.Stub.asInterface(service); 177 } 178 179 /** @hide */ 180 @Override onCarDisconnected()181 public void onCarDisconnected() { 182 synchronized (this) { 183 mBasicInfo = null; 184 } 185 } 186 } 187